;Yet another Transport Simulation
;
;program to solve an onedimensional advection-dispersion equation
;with kinetic sorption and GUI
;
;by Thomas Ritschel
;
;code written in PureBasic 5.00
;
;criticial code in asm

IncludeFile "matrix.pb"

;{ init
;-init
Global roundmode.w=%0000011101111111
Global FPU_ControlWord.w=%0000001101111111
Global hugenumber.d=Pow(10,25)
!fstcw [v_FPU_ControlWord]
;Debug RSet(Bin(FPU_ControlWord),16,"0")
InitMouse()
InitSprite()
UsePNGImageEncoder()
UseJPEGImageDecoder()

;}

;{ Structures
;-Structures

Structure xy ;Paar Structure fr alle mglichen Wertepaar-Felder
  x.d
  y.d
EndStructure

Structure para
  *var
  start.d
  n_string.i
  name.s
  derivate_sum.d
  limit.d
EndStructure
;}

;{ Variablendeklaration
;- Variablendeklaration

Global flux_conc.b
Global samplename.s
Global raster.i
Global tiefe.i
Global import_column.i
Global scrheight.i
Global scrwidth.i
Global sigma.d
Global genaugenug.b
Global modelrun.i
Global lambda.d
Global mass_trans_im.d
Global theta_im.d
Global theta_im_anteil.d
Global inversionmode.b
Global inversionmode_alt.b=0
Global background.d
Global temperaturkoeffizient.d
Global drawflussunterbrechung.i
Global last_inversion_parameter.i
Global last_inversion_parameter2.i
Global last_inversion_curve.i
Global verdunstung.d
Global anfangszustand.i=1
Global n_student_t.i=0
Global statistics.s
Global export_statistics.s
Global anzahl_rmsewerte.i=0
Global xpos.i
Global ypos.i
Global language.s
Global hintergrund.d
Global directory.s
Global maindirectory.s=GetCurrentDirectory()
Global deltax.d
Global deltax_alt.d
Global deltat.d
Global scalex.d
Global scalex_dbk.d
Global scaley.d
Global Diff.d
Global long_Disp.d
Global dispersivity.d
Global Q.d
Global v.d
Global Q_start.d
Global Q_alt.d
Global Q_merken.d
Global time.d
Global nodes.l
Global nodesalt.l
Global sum_control.d
Global sum_control_S.d
Global sum_control_Seq.d
Global sum_check_imp.d
Global S_check_imp.d
Global Seq_check_imp.d
Global peak_imp.d
Global minx.d
Global maxx.d
Global conc_vg_init.d
Global conc_vg_imp.d
Global conc_dfz_in.d
Global conc_dfz_ef.d
Global conc_dfz_in_start.d
Global conc_dfz_ef_start.d
Global middle.d
Global length.d
Global min.d
Global max.d
Global lehre.i=1
Global first.b
Global hold.b
Global drawvg.b
Global drawdbk.b
Global drawconc.b
Global drawS.b
Global drawSeq.b
Global drawimport.b
Global drawdfz_in.b
Global drawdfz_ef.b
Global drawfrakt.b
Global drawspannung.b
Global drawstrom.b
Global drawbac.b
Global drawfft.b
Global usesorption.b
Global kreislauf.b
Global recorddbk.b
Global go.b
Global flussunterbrechung.b
Global init_sucess.b
Global dataimported.b
Global drawinversionparameters.b
Global minimize.b
Global ReDimdone.b
Global usefittedisotherm.b
Global usefittedisothermeq.b
Global usefittedlf.b
Global usevoltage.b
Global useimportedconc.b=0
Global converttolf.b
Global isotherme.b=1
Global isotherme_alt.b=1
Global verteilung.d
Global steps.i
Global secondwait.d
Global calc_speed.i
Global drawtime.d
Global dbktime.d
Global dbkmaxtime.d
Global dbk_deltat.d
Global dbk_deltat_alt.d
Global frakt_deltat.d
Global frakt_deltat_start.d
Global frakt_deltat_alt.d
Global fraktsum.d
Global frakt_vol.d
Global frakt_time.d
Global dbkpoint_imp.i
Global fraktpoint.i
Global n_dbk.l
Global n_dbk_alt.l
Global n_imp.l
Global n_frakt.l
Global n_para.l
Global vol_vg.d
Global vol_vg_start.d
Global vol_dfz_in.d
Global vol_dfz_ef.d
Global Kd.d
Global kr.d
Global freund_n.d
Global Kd_eq.d
Global freund_n_eq.d
Global haltezeit.d
Global iterationsstart.d
Global iterationsende.d
Global iterationsstart2.d
Global iterationsende2.d
Global steps1.i
Global steps2.i
Global iterationstiefe.i
Global iterationsschritt.i
Global n_iso.i
Global n_isoeq.i
Global n_lfkorr.i
Global n_temp.i
Global obspoint.d
Global theta.d
Global theta_ges.d
Global sorptionmode.b
Global lagerungsdichte.d
Global flussU_s1.d
Global flussU_s2.d
Global flussU_s3.d
Global flussU_s4.d
Global flussU_s5.d
Global flussU_s6.d
Global flussU_s7.d
Global flussU_s8.d
Global flussU_s9.d
Global flussU_s10.d
Global flussU_e1.d
Global flussU_e2.d
Global flussU_e3.d
Global flussU_e4.d
Global flussU_e5.d
Global flussU_e6.d
Global flussU_e7.d
Global flussU_e8.d
Global flussU_e9.d
Global flussU_e10.d
Global weiterQ1.d
Global weiterQ2.d
Global weiterQ3.d
Global weiterQ4.d
Global weiterQ5.d
Global weiterQ6.d
Global weiterQ7.d
Global weiterQ8.d
Global weiterQ9.d
Global weiterQ10.d
Global weiterc1.d
Global weiterc2.d
Global weiterc3.d
Global weiterc4.d
Global weiterc5.d
Global weiterc6.d
Global weiterc7.d
Global weiterc8.d
Global weiterc9.d
Global weiterc10.d
Global weiterf1.d
Global weiterf2.d
Global weiterf3.d
Global weiterf4.d
Global weiterf5.d
Global weiterf6.d
Global weiterf7.d
Global weiterf8.d
Global weiterf9.d
Global weiterf10.d
Global weitervol1.d
Global weitervol2.d
Global weitervol3.d
Global weitervol4.d
Global weitervol5.d
Global weitervol6.d
Global weitervol7.d
Global weitervol8.d
Global weitervol9.d
Global weitervol10.d
Global grundflaeche.d
Global dbk_check.d
Global dfz_in_check.d
Global dfz_ef_check.d
Global vg_check.d
Global meanlf.d
Global spannungsabnahme1.d
Global spannungsabnahme2.d
Global R_Gesamt.d
Global R_Bereich.d
Global spannung_bereich.d
Global spannung_gesamt.d
Global stromfluss.d
Global porositaet.d
Global zementierungsfaktor.d
Global saettigung.d
Global saettigungsexponent.d
Global usetemp.b
Global lfkorrelationskoeffizient.d
Global abbau_1.d
Global produktion.d
Global wachstum.d
Global wachstum_max.d
Global substrataff.d
Global max_pop.d
Global bound_low.d
Global bound_up.d
Global bakterienzahl_init.d
Global selection_bar1.i
Global selection_bar2.i
Global kleinepunkte.i
Global equil_time.i
Global implicit.b
Global addnoise.b
Global norm.d
Global selected_curve_for_FFT.i
Global batch_start.d
Global batch_end.d
Global sens_steps.i
Global sens_log.b
Global last_inversion_parameter_sens.i
Global last_inversion_curve_sens.i
Global use_for_forward_prediction.b=0
Global inv_log1.b
Global inv_log2.b
Global addnoise_to_forwardprediction.b

; hier folgen die init-variablen, die nur beim einlesen neuer parameter  oder beim parameter-reset genutzt werden
Global background_init.d
Global mass_trans_im_init.d
Global theta_im_anteil_init.d
Global temperaturkoeffizient_init.d
Global drawflussunterbrechung_init.i
Global verdunstung_init.d
Global hintergrund_init.d
Global deltax_init.d
Global deltat_init.d
Global minx_init.d
Global maxx_init.d
Global Q_init.d
Global Diff_init.d
Global long_Disp_init.d
Global dispersivity_init.d
Global conc_vg_init_init.d
Global vol_vg_init.d
Global vol_dfz_in_init.d
Global vol_dfz_ef_init.d
Global conc_dfz_in_init.d
Global conc_dfz_ef_init.d
Global kr_init.d
Global Kd_init.d
Global freund_n_init.d
Global Kd_eq_init.d
Global freund_n_eq_init.d
Global drawvg_init.b
Global drawdbk_init.b
Global drawconc_init.b
Global drawS_init.b
Global drawSeq_init.b
Global drawspannung_init.b
Global drawstrom_init.b
Global verteilung_init.d
Global drawdfz_in_init.b
Global drawdfz_ef_init.b
Global drawfrakt_init.b
Global drawbac_init.b
Global drawfft_init.b
Global usesorption_init.b
Global usefittedisotherm_init.b
Global usefittedisothermeq_init.b
Global usefittedlf_init.b
Global usevoltage_init.b
Global converttolf_init.b
Global sorptionmode_init.b
Global isotherme_init.b
Global drawimport_init.b
Global kreislauf_init.b
Global recorddbk_init.b
Global dbkmaxtime_init.d
Global haltezeit_init.d
Global dbk_deltat_init.d
Global frakt_deltat_init.d
Global conc_vg_init_alt.d
Global obspoint_init.d
Global theta_ges_init.d
Global lagerungsdichte_init.d
Global spannung_gesamt_init.d
Global spannungsabnahme1_init.d
Global spannungsabnahme2_init.d
Global grundflaeche_init.d
Global porositaet_init.d
Global zementierungsfaktor_init.d
Global saettigung_init.d
Global saettigungsexponent_init.d
Global usetemp_init.b
Global lfkorrelationskoeffizient_init.d
Global abbau_1_init.d
Global produktion_init.d
Global wachstum_max_init.d
Global substrataff_init.d
Global bakterienzahl_init_init.d
Global temperature_factor.d
Global cooling_speed.d

Global farbec.l
Global farbes.l
Global farbeseq.l
Global farbedbk.l
Global farbedfz_in.l
Global farbedfz_ef.l
Global farbevg.l
Global farbefrakt.l
Global farbeimp.l
Global farbelf.l
Global farbespannung.l
Global farbestrom.l
Global farbebac.l

Global Dim student_t_verteilung.xy(n_student_t)
Global Dim rmsewerte.xy(anzahl_rmsewerte)
Global Dim draw_rmsewerte.xy(anzahl_rmsewerte)
Global Dim initconc.d(nodes)   ;Initialkonzentrationen in der Sule
Global Dim initS.d(nodes)
Global Dim initSeq.d(nodes)
Global Dim S_implicit.d(nodes)   ;aktuelle Konzentrationen in der Sule
Global Dim Seq.d(nodes)
Global Dim conc_implicit.d(nodes)
Global Dim bakterien.d(nodes)
Global Dim dbk_implicit.d(n_dbk)   ;Durchbruchskurve am obspoint
Global Dim dbk_implicit_vg.d(n_dbk)  ;Vorratsgefverlauf
Global Dim dbk_pv.d(n_dbk)     ;Aufzeichung ausgetauschter Porenvolumen
Global Dim dbk_dfz_in.d(n_dbk) ;Konzentrationsverlauf in der DFZ
Global Dim dbk_dfz_ef.d(n_dbk)
Global Dim dbk_fft.d(n_dbk)
Global Dim drawconc_implicit.d(560)  ;draw-Arrays die lediglich dem Zeichnen der Graphen dienen, sind immer auf 560 skaliert
Global Dim drawS_implicit.d(560)
Global Dim drawdbk_implicit.d(560)
Global Dim drawdbk_implicit_vg.d(560)
Global Dim drawdbk_import.xy(n_imp)
Global Dim drawdbk_frakt.xy(n_frakt)
Global Dim drawdbk_dfz_in.d(560)
Global Dim drawdbk_dfz_ef.d(560)
Global Dim drawdbk_fft.d(560)
Global Dim drawSeq.d(560)
Global Dim draw_bakterien.d(560)
Global Dim lfkorrelation.xy(n_lfkorr)   ;aktuelle Leitfhigkeitskorrelation mit C und LF
Global Dim tempgang.xy(n_temp)
Global Dim matrix.d(4,nodes)      ;matrix zum impliziten lsen der ADE 
Global Dim linearisotherm.xy(n_iso) ;lineare Isothermen
Global Dim linearisothermeq.xy(n_isoeq)
Global Dim import_xy.xy(n_imp)    ;importierte Kurve
Global Dim fraktionen.xy(n_frakt) ;Fraktionen

Global Dim conc_immobile.d(nodes)
Global Dim drawconc_immobile.d(560)
Global Dim S_immobile.d(nodes)
Global Dim Seq_immobile.d(nodes)
Global Dim drawS_immobile.d(560)
Global Dim drawSeq_immobile.d(560)

Global Dim strom.d(n_dbk)
Global Dim drawstrom.d(560)
Global Dim spannung.d(n_dbk)
Global Dim drawspannung.d(560)

Global Dim parameters.para(n_para)
;}

;{ Gadget Constants
;- Gadget Constants
#eol=Chr(13)+Chr(10)
#num_tolerance=0.000001
Enumeration
  
  #Text_background
  #Text_temperaturkoeffizient
  #Text_deltax
  #Text_deltat
  #Text_minx
  #Text_maxx
  #Text_sigma
  #Text_Q
  #Text_Diff
  #Text_dispersivity
  #Text_conc_vg
  #Text_vol_DFZ_in
  #Text_vol_DFZ_ef
  #Text_conc_DFZ_in
  #Text_conc_DFZ_ef
  #Text_dbkmaxtime
  #Text_dbk_deltat
  #Text_Fraktionsdauer
  #Text_vol_vg
  #Text_sorptionsrate
  #Text_Kd
  #Text_freund_n
  #Text_Kd_eq
  #Text_freund_n_eq
  #Text_verteilung
  #Text_haltezeit 
  #Text_iterationsstart
  #Text_iterationsende
  #Text_iterationsstart2
  #Text_iterationsende2
  #Text_Steps1
  #Text_Steps2
  #Text_iterationstiefe
  #Text_iterationsraster 
  #Text_obspoint
  #Text_flussunterbrechung
  #Text_flussunterbrechung_von
  #Text_flussunterbrechung_bis
  #Text_weiterv
  #Text_weiterc
  #Text_weiterf
  #Text_weitervol
  #Text_Wassergehalt
  #Text_theta_immobile
  #Text_massentransfer_immobile
  #Text_Grundflaeche
  #Text_Lagerungsdichte  
  #Text_inversionsauswahl
  #Text_Parameter_Inv
  #Text_Parameter_Inv2
  #Text_FarbeC
  #Text_FarbeS
  #Text_FarbeSeq
  #Text_FarbeDBK
  #Text_FarbeDFZ_in
  #Text_FarbeDFZ_ef
  #Text_FarbeVG
  #Text_FarbeImp
  #Text_FarbeFrakt
  #Text_FarbeSpannung
  #Text_FarbeStrom
  #Text_FarbeBac
  #Text_Spannung
  #Text_Abnahme1
  #Text_Abnahme2
  #Text_Porositaet
  #Text_Zementierungsfaktor
  #Text_Saettigung
  #Text_Saettigungsexponent
  #Text_LFKorrelationskoeffizient
  #Text_Abbau_1
  #Text_Produktion
  #Text_Verdunstung
  #Text_Export
  #Text_Import
  #Text_Inversionstiefe
  #Text_Wachstum_max
  #Text_Substrataff
  #Text_Bakterienzahl_init
  #Text_cooling_speed
  #Text_temperature_factor
  #Text_equil_time
  #Text_Norm
  #Text_FFT
  #Text_sens_max
  #Text_sens_min
  #Text_sens_selectbtc
  #Text_sens_parameter
  #Text_sens_steps
  
  #Frame_NGG_main
  #Frame_GG_main
  #Frame_NGG
  
  #String_sigma
  #String_background
  #String_temperaturkoeffizient
  #String_deltax
  #String_deltat
  #String_minx
  #String_maxx
  #String_Q
  #String_Diff
  #String_dispersivity
  #String_theta_immobile
  #String_massentransfer_immobile
  #String_conc_vg
  #String_vol_DFZ_in
  #String_vol_DFZ_ef
  #String_conc_DFZ_in
  #String_conc_DFZ_ef
  #String_dbkmaxtime
  #String_dbk_deltat
  #String_Fraktionsdauer
  #String_vol_vg
  #String_kr
  #String_Kd
  #String_freund_n
  #String_Kd_eq
  #String_freund_n_eq
  #String_verteilung
  #String_haltezeit
  #String_iterationsstart
  #String_iterationsende
  #String_iterationsstart2
  #String_iterationsende2
  #String_flussunterbrechung_s1
  #String_flussunterbrechung_s2
  #String_flussunterbrechung_s3
  #String_flussunterbrechung_s4
  #String_flussunterbrechung_s5
  #String_flussunterbrechung_s6
  #String_flussunterbrechung_s7
  #String_flussunterbrechung_s8
  #String_flussunterbrechung_s9
  #String_flussunterbrechung_s10
  #String_flussunterbrechung_e1
  #String_flussunterbrechung_e2
  #String_flussunterbrechung_e3
  #String_flussunterbrechung_e4
  #String_flussunterbrechung_e5
  #String_flussunterbrechung_e6
  #String_flussunterbrechung_e7
  #String_flussunterbrechung_e8
  #String_flussunterbrechung_e9
  #String_flussunterbrechung_e10
  #String_weiterQ1
  #String_weiterQ2
  #String_weiterQ3
  #String_weiterQ4
  #String_weiterQ5
  #String_weiterQ6
  #String_weiterQ7
  #String_weiterQ8
  #String_weiterQ9
  #String_weiterQ10
  #String_weiterc1
  #String_weiterc2
  #String_weiterc3
  #String_weiterc4
  #String_weiterc5
  #String_weiterc6
  #String_weiterc7
  #String_weiterc8
  #String_weiterc9
  #String_weiterc10
  #String_weiterf1
  #String_weiterf2
  #String_weiterf3
  #String_weiterf4
  #String_weiterf5
  #String_weiterf6
  #String_weiterf7
  #String_weiterf8
  #String_weiterf9
  #String_weiterf10
  #String_weitervol1
  #String_weitervol2
  #String_weitervol3
  #String_weitervol4
  #String_weitervol5
  #String_weitervol6
  #String_weitervol7
  #String_weitervol8
  #String_weitervol9
  #String_weitervol10
  #String_Lagerungsdichte
  #String_theta
  #String_obspoint
  #String_Grundflaeche
  #String_Spannung
  #String_Abnahme1
  #String_Abnahme2
  #String_Porositaet
  #String_Zementierungsfaktor
  #String_Saettigung
  #String_Saettigungsexponent
  #String_LFKorrelationskoeffizient
  #String_Abbau_1
  #String_Produktion
  #String_Verdunstung
  #String_Wachstum_max
  #String_Substrataff
  #String_Bakterienzahl_init
  #String_cooling_speed
  #String_temperature_factor
  #String_equil_time
  #String_norm
  #String_sens_max
  #String_sens_min
   
  #Button_Start
  #Button_Beenden
  #Button_Standard
  #Button_Hilfe
  #Button_ReadPar
  #Button_SavePar
  #Button_ExportDBK
  #Button_ImportDBK
  #Button_ImportC
  #Button_ImportS
  #Button_ImportSeq
  #Button_ExportCS
  #Button_Importisothermeq
  #Button_Importisotherm
  #Button_Inversion
  #Button_StartInv
  #Button_CloseWin
  #Button_Display_RMSE
  #Button_Export_statistics
  #Button_Rescale
  #Button_FarbeC
  #Button_FarbeS
  #Button_FarbeSeq
  #Button_FarbeDBK
  #Button_FarbeDFZ_in
  #Button_FarbeDFZ_ef
  #Button_FarbeVG
  #Button_FarbeImp
  #Button_FarbeFrakt
  #Button_FarbeSpannung
  #Button_FarbeStrom
  #Button_FarbeBac
  #Button_ImportLFKorrelation
  #Button_Language
  #Button_Zeige_Derivatives
  #Button_ImportTemp
  #Button_Moments
  #Button_Mouse
  #Button_reichtso
  #Button_EndSelection
  #Button_ExportSSQ
  #Button_FFT
  #Button_sens_Start
  #Button_sens_Windows
  #Button_clearFI
  #Button_FittingCriteria
  
  #CheckBox_drawconc
  #CheckBox_drawS
  #CheckBox_drawSeq
  #CheckBox_drawDBK
  #CheckBox_drawvg
  #CheckBox_drawdfz_in
  #CheckBox_drawdfz_ef
  #CheckBox_drawfrakt
  #CheckBox_drawspannung
  #CheckBox_drawstrom
  #CheckBox_drawbac
  #CheckBox_drawfft
  #CheckBox_kreislauf
  #CheckBox_recordDBK
  #CheckBox_drawimport
  #CheckBox_usesorption
  #CheckBox_usefittedisotherm
  #CheckBox_usefittedisothermeq
  #CheckBox_usefittedlf
  #CheckBox_usevoltage
  #CheckBox_converttolf
  #CheckBox_drawflussunterbrechung
  #CheckBox_usetemp
  #CheckBox_kleinePunkte
  #CheckBox_implicit_euler
  #CheckBox_addnoise
  #Checkbox_sens_logsteps
  #CheckBox_useforwardprediction
  #CheckBox_inv_logsteps1
  #CheckBox_inv_logsteps2
  #CheckBox_noise_on_forwardprediction
  
  #Radio_bezogen_auf_time
  #Radio_bezogen_auf_dbktime
  #Radio_singleinversion
  #Radio_multipleinversion
  #Radio_SAinversion
  #Radio_sensitivity
  
  #Radio_normalsorption
  #Radio_newton
  #Radio_Isotherme_freund
  #Radio_Isotherme_langmuir
  
  #Radio_resident_conc
  #Radio_flux_conc
  
  #Spin_Iterationstiefe
  #Spin_Iterationsraster
  #Spin_Inversionstiefe
  #Spin_Steps1
  #Spin_Steps2
  #Spin_sens_steps
  
  #ListIcon_Parameters
  
  #Combo_Parameter_Inv
  #Combo_Parameter_Inv2
  #Combo_SelectInv
  #Combo_SelectColumn
  #Combo_FFT
  #Combo_sens_selectbtc
  #Combo_sens_parameter
  
  #Panel_Parameter
  
EndEnumeration

;}

;{ Declarations
;- Declarations

Declare.b fitting_criteria(Array source.d(1))
Declare batch_btcs()
Declare export_dbk()
Declare export_conc()
Declare.d show_extrema(silent.i=0)
Declare import_dbk()
Declare import_conc()
Declare import_S()
Declare import_Seq()
Declare inversion()
Declare inversion_multi()
Declare sensitivity()
Declare import_isotherm()
Declare import_isothermeq()
Declare set_scale()
Declare draw_coordinate()
Declare convert_to_scale()
Declare draw_graph_as_line()
Declare draw_conc(*ArrayPointer,farbe.l)
Declare shutdown()
Declare Import_lfkorrelation()
Declare Import_temp()
Declare.b check_overwrite(filename.s)
Declare.d get_normal_rnd(mean.d,sigma.d)
;}

Procedure set_language()
  
  temp.s  
  
  If first
    OpenPreferences(maindirectory+language)
  Else 
    temp=OpenFileRequester("Select Language File",maindirectory+"*.dat","Daten (*.dat)|*.dat|Alle Dateien (*.*)|*.*",0)
    If OpenPreferences(temp)    
      language=GetFilePart(temp)
    ElseIf temp
      MessageRequester("Error","Could not open file")
    EndIf  
  EndIf
  
  SetGadgetItemText(#Panel_Parameter,0,ReadPreferenceString("lang_allg","Allgemeines"))
  SetGadgetItemText(#Panel_Parameter,1,ReadPreferenceString("lang_discret","Diskretisierung"))
  SetGadgetItemText(#Panel_Parameter,2,ReadPreferenceString("lang_transport","Transport"))
  SetGadgetItemText(#Panel_Parameter,3,ReadPreferenceString("lang_sorption","Sorption"))
  SetGadgetItemText(#Panel_Parameter,4,ReadPreferenceString("lang_decay_production","Abbau/Produktion"))
  SetGadgetItemText(#Panel_Parameter,5,ReadPreferenceString("lang_flowinterupt","Flussu."))
  SetGadgetItemText(#Panel_Parameter,6,ReadPreferenceString("lang_electrical","Leitf."))
  SetGadgetItemText(#Panel_Parameter,7,ReadPreferenceString("lang_drawoptions","Zeichenoptionen"))
  SetGadgetItemText(#Panel_Parameter,8,ReadPreferenceString("lang_import_export","Import/Export"))
  SetGadgetText(#Text_background,ReadPreferenceString("lang_background","Hintergrund"))
  SetGadgetText(#Text_haltezeit,ReadPreferenceString("lang_haltezeit","Haltezeit"))
  SetGadgetText(#Text_obspoint,ReadPreferenceString("lang_obspoint","Observation Point"))
  SetGadgetText(#Checkbox_kreislauf,ReadPreferenceString("lang_kreislauf","Kreislauf"))
  SetGadgetText(#CheckBox_recordDBK,ReadPreferenceString("lang_recorddbk","DBK aufnehmen"))
  SetGadgetText(#CheckBox_drawflussunterbrechung,ReadPreferenceString("lang_drawfi","Flussunterbrechung zeichnen"))
  SetGadgetText(#CheckBox_usefittedisotherm,ReadPreferenceString("lang_useimpneq","benutze importierte Isotherme neq"))
  SetGadgetText(#CheckBox_usefittedisothermeq,ReadPreferenceString("lang_useimpeq","benutze importierte Isotherme eq"))
  SetGadgetText(#CheckBox_usefittedlf,ReadPreferenceString("lang_useimplf","benutze importierte LF-Korrelation"))
  SetGadgetText(#CheckBox_converttolf,ReadPreferenceString("lang_dbktolf","Umwandlung der DBK auf LF"))
  SetGadgetText(#CheckBox_usetemp,ReadPreferenceString("lang_usetemp","berechne Temperaturgang"))
  SetGadgetText(#Radio_bezogen_auf_time,ReadPreferenceString("lang_bezogenaufgesamt","bezogen auf Gesamtzeit"))
  SetGadgetText(#Radio_bezogen_auf_dbktime,ReadPreferenceString("lang_bezogenaufdbk","bezogen auf DBK"))
  SetGadgetText(#Button_Language,ReadPreferenceString("lang_selectlanguage","Sprachdatei whlen"))
  SetGadgetText(#Text_deltax,ReadPreferenceString("lang_delta_x","delta x"))
  SetGadgetText(#Text_deltat,ReadPreferenceString("lang_delta_t","delta t"))
  SetGadgetText(#Text_minx,ReadPreferenceString("lang_minx","min x"))
  SetGadgetText(#Text_maxx,ReadPreferenceString("lang_maxx","max x"))
  SetGadgetText(#Text_dbkmaxtime,ReadPreferenceString("lang_dbk_maxtime","DBK Zeit"))
  SetGadgetText(#Text_dbk_deltat,ReadPreferenceString("lang_dbk_delta_t","DBK delta t"))
  SetGadgetText(#Text_Fraktionsdauer,ReadPreferenceString("lang_frac_delta_t","Fraktionen delta_t"))
  SetGadgetText(#Text_Grundflaeche,ReadPreferenceString("lang_grundflaeche","Grundflche"))
  SetGadgetText(#Text_Q,ReadPreferenceString("lang_Q","Pumprate"))
  SetGadgetText(#Text_Diff,ReadPreferenceString("lang_diff_coeff","Diffusionskoeffizient"))
  SetGadgetText(#Text_dispersivity,ReadPreferenceString("lang_dispersivity","Dispersivitt"))
  SetGadgetText(#Text_Wassergehalt,ReadPreferenceString("lang_theta","vol. Wassergehalt"))
  SetGadgetText(#Text_conc_vg,ReadPreferenceString("lang_conc_vg","Konzentration im VG"))
  SetGadgetText(#Text_vol_vg,ReadPreferenceString("lang_vol_vg","Volumen des VG"))
  SetGadgetText(#Text_vol_dfz_in,ReadPreferenceString("lang_vol_dfz_in","Totvolumen Influent"))
  SetGadgetText(#Text_vol_dfz_ef,ReadPreferenceString("lang_vol_dfz_ef","Totvolumen Effluent"))
  SetGadgetText(#Text_conc_dfz_in,ReadPreferenceString("lang_conc_dfz_in","Conc. Totvolumen Influent"))
  SetGadgetText(#Text_conc_dfz_ef,ReadPreferenceString("lang_conc_dfz_ef","Conc. Totvolumen Effluent"))
  SetGadgetText(#Text_theta_immobile,ReadPreferenceString("lang_theta_immobile","Anteil im. Porenwasser"))
  SetGadgetText(#Text_massentransfer_immobile,ReadPreferenceString("lang_mass_transfer_immobile","Massentransfer im. Porenwasser"))  
  SetGadgetText(#Text_Verdunstung,ReadPreferenceString("lang_evaporation","Verdunstung"))
  SetGadgetText(#CheckBox_usesorption,ReadPreferenceString("lang_use_sorption","berechne Sorption"))
  SetGadgetText(#Radio_Isotherme_freund,ReadPreferenceString("lang_isotherm_freund","Freundlich Isotherme"))
  SetGadgetText(#Radio_Isotherme_langmuir,ReadPreferenceString("lang_isotherm_langmuir","Langmuir Isotherme"))
  SetGadgetText(#Text_Lagerungsdichte,ReadPreferenceString("lang_bulk_density","Dichte der Sorptionspltze"))
  SetGadgetText(#Text_sorptionsrate,ReadPreferenceString("lang_mass_transfer","Massentransferkoeffizient"))
  SetGadgetText(#Text_verteilung,ReadPreferenceString("lang_anteil_eq","GG-Sorptionspltze (Anteil)"))
  SetGadgetText(#Frame_NGG,ReadPreferenceString("lang_solution_ngg","Lsungsverfahren fr Nichtgleichgewichtssorption"))
  SetGadgetText(#Frame_NGG_main,ReadPreferenceString("lang_ngg_main","Parameter fr Nichtgleichgewichtssorption"))
  SetGadgetText(#Frame_GG_main,ReadPreferenceString("lang_gg_main","Parameter fr Gleichgewichtssorption"))
  SetGadgetText(#Radio_normalsorption,ReadPreferenceString("lang_normalsorption","ohne Stabilittsprfung"))
  SetGadgetText(#Radio_newton,ReadPreferenceString("lang_newton","Newton-Verfahren"))
  SetGadgetText(#Text_Abbau_1,ReadPreferenceString("lang_decay","Abbau 1. Ordnung"))
  SetGadgetText(#Text_Produktion,ReadPreferenceString("lang_production","Produktion"))
  SetGadgetText(#Text_Wachstum_max,ReadPreferenceString("lang_growth_max","maximale Wachstumsrate"))
  SetGadgetText(#Text_Substrataff,ReadPreferenceString("lang_substrate_affinity","Substrataffinitt"))
  SetGadgetText(#Text_Bakterienzahl_init,ReadPreferenceString("lang_init_bacteria","init. Bakterienzahl"))
  SetGadgetText(#CheckBox_usevoltage,ReadPreferenceString("lang_usevoltage","berechne Spannung"))
  SetGadgetText(#Text_Spannung,ReadPreferenceString("lang_voltage","angelegte Spannung"))
  SetGadgetText(#Text_Abnahme1,ReadPreferenceString("lang_collect1","Abnahmepunkt 1"))
  SetGadgetText(#Text_Abnahme2,ReadPreferenceString("lang_collect2","Abnahmepunkt 2"))
  SetGadgetText(#Text_Porositaet,ReadPreferenceString("lang_porosity","Porositt"))  
  SetGadgetText(#Text_Zementierungsfaktor,ReadPreferenceString("lang_cementation","Zementierungsfaktor"))
  SetGadgetText(#Text_Saettigung,ReadPreferenceString("lang_saturation","Sttigung"))
  SetGadgetText(#Text_Saettigungsexponent,ReadPreferenceString("lang_sat_exp","Sttigungsexponent"))
  SetGadgetText(#Text_LFKorrelationskoeffizient,ReadPreferenceString("lang_lfkorrkoeff","LF-Korrelationskoeff."))
  SetGadgetText(#Text_temperaturkoeffizient,ReadPreferenceString("lang_tempcoeff","Temperaturkoeffizient"))
  SetGadgetText(#Text_flussunterbrechung,ReadPreferenceString("lang_flow_interrupts","Flussunterbrechungen"))
  SetGadgetText(#Text_flussunterbrechung_von,ReadPreferenceString("lang_flow_interrupts_from","von"))
  SetGadgetText(#Text_flussunterbrechung_bis,ReadPreferenceString("lang_flow_interrupts_to","bis"))
  SetGadgetText(#Text_weiterv,ReadPreferenceString("lang_flow_interrupts_Q","weiter Q="))
  SetGadgetText(#Text_weiterc,ReadPreferenceString("lang_flow_interrupts_c","weiter c="))
  SetGadgetText(#Text_weiterf,ReadPreferenceString("lang_flow_interrupts_f","weiter f="))
  SetGadgetText(#Text_weitervol,ReadPreferenceString("lang_flow_interrupts_vol","weiter vol="))
  SetGadgetText(#CheckBox_drawconc,ReadPreferenceString("lang_draw_concentration","Konzentrationsverteilung in der Sule"))
  SetGadgetText(#checkbox_drawS,ReadPreferenceString("lang_draw_S","sorbierte Konzentration in der Sule neq"))
  SetGadgetText(#checkbox_drawSeq,ReadPreferenceString("lang_draw_Seq","sorbierte Konzentration in der Sule eq"))
  SetGadgetText(#CheckBox_drawDBK,ReadPreferenceString("lang_draw_dbk","Durchbruchskurve"))
  SetGadgetText(#CheckBox_drawvg,ReadPreferenceString("lang_draw_vg","Vorratsgef"))
  SetGadgetText(#CheckBox_drawimport,ReadPreferenceString("lang_draw_import","Importierte Daten"))
  SetGadgetText(#CheckBox_drawdfz_in,ReadPreferenceString("lang_draw_dfz_in","Totvolumen Influent"))
  SetGadgetText(#CheckBox_drawdfz_ef,ReadPreferenceString("lang_draw_dfz_ef","Totvolumen Effluent"))
  SetGadgetText(#CheckBox_drawfrakt,ReadPreferenceString("lang_draw_frac","Fraktionen")) 
  SetGadgetText(#CheckBox_drawspannung,ReadPreferenceString("lang_draw_voltage","Spannung")) 
  SetGadgetText(#CheckBox_drawstrom,ReadPreferenceString("lang_draw_current","Strom"))
  SetGadgetText(#CheckBox_drawbac,ReadPreferenceString("lang_draw_bac","Bakterien"))
  SetGadgetText(#CheckBox_kleinePunkte,ReadPreferenceString("lang_small_points","kleine Punkte"))
  SetGadgetText(#Button_FarbeC,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_FarbeS,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_FarbeSeq,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_FarbeDBK,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_Farbevg,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_FarbeImp,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_FarbeDFZ_in,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_FarbeDFZ_ef,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_FarbeFrakt,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_FarbeSpannung,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_FarbeStrom,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_FarbeBac,ReadPreferenceString("lang_change_color","Farbe ndern..."))
  SetGadgetText(#Button_Zeige_Derivatives,ReadPreferenceString("lang_show_derivatives","Ableitungen"))
  SetGadgetText(#Button_Moments,ReadPreferenceString("lang_central_moments","zentr. Momente"))
  
  tempstate=GetGadgetState(#Combo_FFT)
  SetGadgetItemText(#Combo_FFT, 0, ReadPreferenceString("lang_draw_dbk","Durchbruchskurve"))
  SetGadgetItemText(#Combo_FFT, 1, ReadPreferenceString("lang_draw_vg","Vorratsgef"))
  SetGadgetItemText(#Combo_FFT, 2, ReadPreferenceString("lang_draw_import","Importierte Daten"))
  SetGadgetItemText(#Combo_FFT, 3, ReadPreferenceString("lang_draw_dfz_in","Totvolumen Influent"))
  SetGadgetItemText(#Combo_FFT, 4, ReadPreferenceString("lang_draw_dfz_ef","Totvolumen Effluent"))
  SetGadgetState(#Combo_FFT,tempstate)
  
  If IsWindow(2)
    For i=0 To 1
    tempstate=GetGadgetState(#Combo_Parameter_Inv+i)
    SetGadgetItemText(#Combo_Parameter_Inv+i, 0, ReadPreferenceString("lang_Q","Q"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 1, ReadPreferenceString("lang_diff_coeff","diffusion"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 2, ReadPreferenceString("lang_dispersivity","dispersivity"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 3, ReadPreferenceString("lang_mass_transfer","mass transfer"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 4, ReadPreferenceString("lang_Kd","mass transfer")+" eq")
    SetGadgetItemText(#Combo_Parameter_Inv+i, 5, ReadPreferenceString("lang_Kd","mass transfer")+" neq")
    SetGadgetItemText(#Combo_Parameter_Inv+i, 8, ReadPreferenceString("lang_theta","theta"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 9, ReadPreferenceString("lang_length","length of the column"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 10, ReadPreferenceString("lang_bulk_density","bulk density"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 11, ReadPreferenceString("lang_anteil_eq","fraction of equilibrium sites"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 12, ReadPreferenceString("lang_theta_immobile","fraction im. region"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 13, ReadPreferenceString("lang_mass_transfer_immobile","mass transfer to im. region"))  
    SetGadgetItemText(#Combo_Parameter_Inv+i, 14, ReadPreferenceString("lang_decay","1st order decay"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 15, ReadPreferenceString("lang_production","production"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 16, ReadPreferenceString("lang_evaporation","evaporation"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 17, ReadPreferenceString("lang_porosity","porosity"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 18, ReadPreferenceString("lang_cementation","cementation"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 19, ReadPreferenceString("lang_saturation","saturation"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 20, ReadPreferenceString("lang_sat_exp","saturation exponent"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 21, ReadPreferenceString("lang_tempcoeff","temperature coefficient"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 22, ReadPreferenceString("lang_vol_dfz_in","dead volume influent"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 23, ReadPreferenceString("lang_vol_dfz_ef","dead volume effluent"))    
    SetGadgetItemText(#Combo_Parameter_Inv+i, 24, ReadPreferenceString("lang_background","concentration at start"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 25, ReadPreferenceString("lang_conc_vg","concentration in supply vessel"))
    SetGadgetItemText(#Combo_Parameter_Inv+i, 26, ReadPreferenceString("lang_vol_vg","volume of supply vessel"))
    SetGadgetState(#Combo_Parameter_Inv,tempstate)
    Next i
    SetGadgetItemText(#ListIcon_Parameters, 0, ReadPreferenceString("lang_Q","Q"))
    SetGadgetItemText(#ListIcon_Parameters, 1, ReadPreferenceString("lang_diff_coeff","diffusion"))
    SetGadgetItemText(#ListIcon_Parameters, 2, ReadPreferenceString("lang_dispersivity","dispersivity"))
    SetGadgetItemText(#ListIcon_Parameters, 3, ReadPreferenceString("lang_mass_transfer","mass transfer"))
    SetGadgetItemText(#ListIcon_Parameters, 4, ReadPreferenceString("lang_Kd","mass transfer")+" eq")
    SetGadgetItemText(#ListIcon_Parameters, 5, ReadPreferenceString("lang_Kd","mass transfer")+" neq")
    SetGadgetItemText(#ListIcon_Parameters, 8, ReadPreferenceString("lang_theta","theta"))
    SetGadgetItemText(#ListIcon_Parameters, 9, ReadPreferenceString("lang_bulk_density","bulk density"))
    SetGadgetItemText(#ListIcon_Parameters, 10, ReadPreferenceString("lang_anteil_eq","fraction of equilibrium sites"))    
    SetGadgetItemText(#ListIcon_Parameters, 11, ReadPreferenceString("lang_theta_immobile","fraction im. region"))
    SetGadgetItemText(#ListIcon_Parameters, 12, ReadPreferenceString("lang_mass_transfer_immobile","mass transfer to im. region"))    
    SetGadgetItemText(#ListIcon_Parameters, 13, ReadPreferenceString("lang_decay","1st order decay"))
    SetGadgetItemText(#ListIcon_Parameters, 14, ReadPreferenceString("lang_production","production"))
    SetGadgetItemText(#ListIcon_Parameters, 15, ReadPreferenceString("lang_evaporation","evaporation"))
    SetGadgetItemText(#ListIcon_Parameters, 16, ReadPreferenceString("lang_porosity","porosity"))
    SetGadgetItemText(#ListIcon_Parameters, 17, ReadPreferenceString("lang_cementation","cementation"))
    SetGadgetItemText(#ListIcon_Parameters, 18, ReadPreferenceString("lang_saturation","saturation"))
    SetGadgetItemText(#ListIcon_Parameters, 19, ReadPreferenceString("lang_sat_exp","saturation exponent"))    
    SetGadgetItemText(#ListIcon_Parameters, 20, ReadPreferenceString("lang_tempcoeff","temperature coefficient"))
    SetGadgetItemText(#ListIcon_Parameters, 21, ReadPreferenceString("lang_vol_dfz_in","dead volume influent"))
    SetGadgetItemText(#ListIcon_Parameters, 22, ReadPreferenceString("lang_vol_dfz_ef","dead volume effluent"))    
    SetGadgetItemText(#ListIcon_Parameters, 27, ReadPreferenceString("lang_background","concentration at start"))
    SetGadgetItemText(#ListIcon_Parameters, 28, ReadPreferenceString("lang_conc_vg","concentration in supply vessel"))
    SetGadgetItemText(#ListIcon_Parameters, 29, ReadPreferenceString("lang_vol_vg","volume of supply vessel"))

    SetGadgetText(#Text_cooling_speed,ReadPreferenceString("lang_cooling_speed","cooling speed"))
    SetGadgetText(#Text_temperature_factor,ReadPreferenceString("lang_temperature_factor","temperature factor"))
    SetGadgetText(#Text_equil_time,ReadPreferenceString("lang_equil_time","equilibration time"))
  EndIf
  
  ClosePreferences()
EndProcedure  

Procedure init()  ; lesen des aktuellen Ordners
  
  ExamineDesktops()
  OpenPreferences("init.dat")
  directory=ReadPreferenceString("YATSI_defaultdirectory",GetCurrentDirectory())
  language=ReadPreferenceString("YATSI_language","ger.dat") 
  xpos=ReadPreferenceInteger("YATSI_xpos",0)
  ypos=ReadPreferenceInteger("YATSI_ypos",660)
  If xpos-100>DesktopWidth(0) Or xpos<1:xpos=1:EndIf 
  If ypos-100>DesktopHeight(0) Or ypos<1:ypos=1:EndIf
  last_inversion_parameter=ReadPreferenceInteger("YATSI_last_inversion_parameter",0)
  last_inversion_parameter2=ReadPreferenceInteger("YATSI_last_inversion_parameter2",0)
  last_inversion_parameter_sens=ReadPreferenceInteger("YATSI_last_inversion_parameter_sens",0)
  last_inversion_curve=ReadPreferenceInteger("YATSI_last_inversion_curve",0)
  last_inversion_curve_sens=ReadPreferenceInteger("YATSI_last_inversion_curve_sens",0)
  inversionmode=ReadPreferenceInteger("YATSI_inversionmode",1)
  scrheight=ReadPreferenceInteger("YATSI_screenheight",755)
  scrwidth=ReadPreferenceInteger("YATSI_width",1350)
  norm=ReadPreferenceDouble("YATSI_objective_function_norm",2)
  import_column=ReadPreferenceInteger("YATSI_import_column",0)
  tiefe=ReadPreferenceInteger("YATSI_iteration_depth",1)
  raster=ReadPreferenceInteger("YATSI_iteration_steps",10)
  selected_curve_for_FFT=ReadPreferenceInteger("YATSI_FFT_curve",0)
  steps1=ReadPreferenceInteger("YATSI_Sensitivity_Steps1",100)
  steps2=ReadPreferenceInteger("YATSI_Sensitivity_Steps2",100)
  batch_start=ReadPreferenceDouble("YATSI_Batch_start",0)
  batch_end=ReadPreferenceDouble("YATSI_Batch_end",0)
  sens_steps=ReadPreferenceInteger("YATSI_sens_steps",100)
  sens_log=ReadPreferenceInteger("YATSI_sens_logscale",0)
  inv_log1=ReadPreferenceInteger("YATSI_inv_logscale1",0)
  inv_log2=ReadPreferenceInteger("YATSI_inv_logscale2",0)
  use_for_forward_prediction=ReadPreferenceInteger("YATSI_useforwardprediction",0)
  iterationsstart=ReadPreferenceDouble("YATSI_iterationsstart",0)
  iterationsstart2=ReadPreferenceDouble("YATSI_iterationsstart2",0)
  iterationsende=ReadPreferenceDouble("YATSI_iterationsende",1)
  iterationsende2=ReadPreferenceDouble("YATSI_iterationsende2",1)
  addnoise_to_forwardprediction=ReadPreferenceInteger("YATSI_addnoise_to_forwardprediction",0)
  
  If scrwidth<200:scrwidth=200:EndIf
  If scrheight<200:scrheight=200:EndIf
  ClosePreferences()

EndProcedure

Procedure FFT(Array source.d(1),n.i)
  
  For i=0 To n/2
    sum.d=0
    For j=0 To n
      sum+source(j)*(Cos(2*#PI/n*i*j)+Sin(2*#PI/n*i*j))
    Next j
    dbk_fft(i)=sum
  Next i
      
EndProcedure  

Procedure set_colors() ;Vernderung der Farben
  
  If IsWindow(0)
    SetGadgetColor(#Text_FarbeC,#PB_Gadget_BackColor,farbec)
    SetGadgetColor(#Text_FarbeS,#PB_Gadget_BackColor,farbes)
    SetGadgetColor(#Text_FarbeSeq,#PB_Gadget_BackColor,farbeseq)
    SetGadgetColor(#Text_FarbeDBK,#PB_Gadget_BackColor,farbedbk)
    SetGadgetColor(#Text_FarbeVG,#PB_Gadget_BackColor,farbevg)
    SetGadgetColor(#Text_FarbeImp,#PB_Gadget_BackColor,farbeimp)
    SetGadgetColor(#Text_FarbeDFZ_in,#PB_Gadget_BackColor,farbedfz_in)
    SetGadgetColor(#Text_FarbeDFZ_ef,#PB_Gadget_BackColor,farbedfz_ef)
    SetGadgetColor(#Text_FarbeFrakt,#PB_Gadget_BackColor,farbefrakt)
    SetGadgetColor(#Text_FarbeSpannung,#PB_Gadget_BackColor,farbespannung)
    SetGadgetColor(#Text_FarbeStrom,#PB_Gadget_BackColor,farbestrom)
    SetGadgetColor(#Text_FarbeBac,#PB_Gadget_BackColor,farbebac)
  EndIf        
  
EndProcedure

Procedure.l lichte_farbe(farb.l)
  ;ProcedureReturn RGBA(Red(farb),Green(farb),Blue(farb),100)
  ProcedureReturn RGB(255-0.7*(255-Red(farb)),255-0.7*(255-Green(farb)),255-0.7*(255-Blue(farb)))
EndProcedure  

Procedure.d read_parameters()  ;ldt Einstellungen auf init-variablen
  
  temp.s
  
  If first
    OpenPreferences(directory+"Parameters.ini")
  Else 
    temp=OpenFileRequester("Select Parameter File",directory+"*.*","Initialisierungsdateien (*.ini)|*.ini|Alle Dateien (*.*)|*.*",0)
    If temp 
      directory=GetPathPart(temp)
      SetWindowTitle(0,"Parameter | "+directory) 
    EndIf  
    If OpenPreferences(temp)    
    ElseIf temp
      MessageRequester("Error","Could not open file")
    EndIf  
  EndIf
  
  If temp Or first
    
    deltax_init=ReadPreferenceDouble("deltax", 0.05)
    deltat_init=ReadPreferenceDouble("deltat", 0.2)
    minx_init=ReadPreferenceDouble("minx", 0)
    maxx_init=ReadPreferenceDouble("maxx", 70.9)
    Q_init=ReadPreferenceDouble("Q", 0.197)
    Diff_init=ReadPreferenceDouble("Diff", 0.06)
    dispersivity_init=ReadPreferenceDouble("dispersivity", 0)
    conc_vg_init_init=ReadPreferenceDouble("conc_vg", 5.3)
    vol_vg_init=ReadPreferenceDouble("vol_vg", 20)
    vol_dfz_in_init=ReadPreferenceDouble("vol_dfz_in", 0)
    vol_dfz_ef_init=ReadPreferenceDouble("vol_dfz_ef", 0)
    conc_dfz_in_init=ReadPreferenceDouble("conc_dfz_in", 0)
    conc_dfz_ef_init=ReadPreferenceDouble("conc_dfz_ef", 0)
    theta_im_anteil_init=ReadPreferenceDouble("fraction_theta_im", 0) 
    mass_trans_im_init=ReadPreferenceDouble("mass_transfer_im", 0)
    verdunstung_init=ReadPreferenceDouble("evaporation", 0)
    frakt_deltat_init=ReadPreferenceDouble("Fraktionsdauer",30)
    kr_init=ReadPreferenceDouble("kr", 0.01)
    Kd_init=ReadPreferenceDouble("Kd", 0.5)
    freund_n_init=ReadPreferenceDouble("freund_n", 1)
    Kd_eq_init=ReadPreferenceDouble("Kd_eq", 0.5)
    freund_n_eq_init=ReadPreferenceDouble("freund_n_eq", 1)
    verteilung_init=ReadPreferenceDouble("Verteilung", 1)
    drawvg_init=ReadPreferenceInteger("drawvg", 1)
    drawdbk_init=ReadPreferenceInteger("drawdbk", 1)
    drawconc_init=ReadPreferenceInteger("drawconc", 1)
    drawS_init=ReadPreferenceInteger("drawS", 1)
    drawSeq_init=ReadPreferenceInteger("drawSeq", 1)
    drawimport_init=ReadPreferenceInteger("drawimport", 0)
    drawdfz_in_init=ReadPreferenceInteger("drawdfz_in", 0)
    drawdfz_ef_init=ReadPreferenceInteger("drawdfz_ef", 0)
    drawfrakt_init=ReadPreferenceInteger("drawfrakt", 0)
    drawspannung_init=ReadPreferenceInteger("drawspannung", 0)
    drawstrom_init=ReadPreferenceInteger("drawstrom", 0)
    drawbac_init=ReadPreferenceInteger("drawbac", 0)
    drawfft_init=ReadPreferenceInteger("drawfft", 0)
    usefittedlf_init=ReadPreferenceInteger("usefittedleitfaehigkeit", 0)
    converttolf_init=ReadPreferenceInteger("converttoleitfaehigkeit", 0)
    drawflussunterbrechung_init=ReadPreferenceInteger("drawfi", 0)
    usesorption_init=ReadPreferenceInteger("usesorption", 0)
    usefittedisotherm_init=ReadPreferenceInteger("usefittedisotherm", 0)
    usefittedisothermeq_init=ReadPreferenceInteger("usefittedisothermeq", 0)
    usevoltage_init =ReadPreferenceInteger("usevoltage", 0)
    sorptionmode_init=ReadPreferenceInteger("sorptionmode", 1)
    isotherme_init=ReadPreferenceInteger("isotherme", 1)
    kreislauf_init=ReadPreferenceInteger("kreislauf", 1)
    recorddbk_init=ReadPreferenceInteger("recorddbk", 1)
    dbkmaxtime_init=ReadPreferenceDouble("dbkmaxtime", 1440)
    dbk_deltat_init=ReadPreferenceDouble("dbk_deltat", 1)
    haltezeit_init=ReadPreferenceDouble("haltezeit", 1440)
    obspoint_init=ReadPreferenceDouble("observation point", maxx_init)
    theta_ges_init=ReadPreferenceDouble("theta", 1)
    lagerungsdichte_init=ReadPreferenceDouble("lagerungsdichte", 1)
    grundflaeche_init=ReadPreferenceDouble("Querschnittsflche der Sule", 1)
    flussU_s1=ReadPreferenceDouble("1. Flussunterbrechung Start", -1)
    flussU_s2=ReadPreferenceDouble("2. Flussunterbrechung Start", -1)
    flussU_s3=ReadPreferenceDouble("3. Flussunterbrechung Start", -1)
    flussU_s4=ReadPreferenceDouble("4. Flussunterbrechung Start", -1)
    flussU_s5=ReadPreferenceDouble("5. Flussunterbrechung Start", -1)
    flussU_s6=ReadPreferenceDouble("6. Flussunterbrechung Start", -1)
    flussU_s7=ReadPreferenceDouble("7. Flussunterbrechung Start", -1)
    flussU_s8=ReadPreferenceDouble("8. Flussunterbrechung Start", -1)
    flussU_s9=ReadPreferenceDouble("9. Flussunterbrechung Start", -1)
    flussU_s10=ReadPreferenceDouble("10. Flussunterbrechung Start", -1)
    flussU_e1=ReadPreferenceDouble("1. Flussunterbrechung Ende", -1)
    flussU_e2=ReadPreferenceDouble("2. Flussunterbrechung Ende", -1)
    flussU_e3=ReadPreferenceDouble("3. Flussunterbrechung Ende", -1)
    flussU_e4=ReadPreferenceDouble("4. Flussunterbrechung Ende", -1)
    flussU_e5=ReadPreferenceDouble("5. Flussunterbrechung Ende", -1)
    flussU_e6=ReadPreferenceDouble("6. Flussunterbrechung Ende", -1)
    flussU_e7=ReadPreferenceDouble("7. Flussunterbrechung Ende", -1)
    flussU_e8=ReadPreferenceDouble("8. Flussunterbrechung Ende", -1)
    flussU_e9=ReadPreferenceDouble("9. Flussunterbrechung Ende", -1)
    flussU_e10=ReadPreferenceDouble("10. Flussunterbrechung Ende", -1)
    weiterQ1=ReadPreferenceDouble("1. Flussunterbrechung Q", 0)
    weiterQ2=ReadPreferenceDouble("2. Flussunterbrechung Q", 0)
    weiterQ3=ReadPreferenceDouble("3. Flussunterbrechung Q", 0)
    weiterQ4=ReadPreferenceDouble("4. Flussunterbrechung Q", 0)
    weiterQ5=ReadPreferenceDouble("5. Flussunterbrechung Q", 0)
    weiterQ6=ReadPreferenceDouble("6. Flussunterbrechung Q", 0)
    weiterQ7=ReadPreferenceDouble("7. Flussunterbrechung Q", 0)
    weiterQ8=ReadPreferenceDouble("8. Flussunterbrechung Q", 0)
    weiterQ9=ReadPreferenceDouble("9. Flussunterbrechung Q", 0)
    weiterQ10=ReadPreferenceDouble("10. Flussunterbrechung Q", 0)
    weiterc1=ReadPreferenceDouble("1. Flussunterbrechung c", 0)
    weiterc2=ReadPreferenceDouble("2. Flussunterbrechung c", 0)
    weiterc3=ReadPreferenceDouble("3. Flussunterbrechung c", 0)
    weiterc4=ReadPreferenceDouble("4. Flussunterbrechung c", 0)
    weiterc5=ReadPreferenceDouble("5. Flussunterbrechung c", 0)
    weiterc6=ReadPreferenceDouble("6. Flussunterbrechung c", 0)
    weiterc7=ReadPreferenceDouble("7. Flussunterbrechung c", 0)
    weiterc8=ReadPreferenceDouble("8. Flussunterbrechung c", 0)
    weiterc9=ReadPreferenceDouble("9. Flussunterbrechung c", 0)
    weiterc10=ReadPreferenceDouble("10. Flussunterbrechung c", 0)
    weiterf1=ReadPreferenceDouble("1. Flussunterbrechung f", 0)
    weiterf2=ReadPreferenceDouble("2. Flussunterbrechung f", 0)
    weiterf3=ReadPreferenceDouble("3. Flussunterbrechung f", 0)
    weiterf4=ReadPreferenceDouble("4. Flussunterbrechung f", 0)
    weiterf5=ReadPreferenceDouble("5. Flussunterbrechung f", 0)
    weiterf6=ReadPreferenceDouble("6. Flussunterbrechung f", 0)
    weiterf7=ReadPreferenceDouble("7. Flussunterbrechung f", 0)
    weiterf8=ReadPreferenceDouble("8. Flussunterbrechung f", 0)
    weiterf9=ReadPreferenceDouble("9. Flussunterbrechung f", 0)
    weiterf10=ReadPreferenceDouble("10. Flussunterbrechung f", 0)
    weitervol1=ReadPreferenceDouble("1. Flussunterbrechung vol", 0)
    weitervol2=ReadPreferenceDouble("2. Flussunterbrechung vol", 0)
    weitervol3=ReadPreferenceDouble("3. Flussunterbrechung vol", 0)
    weitervol4=ReadPreferenceDouble("4. Flussunterbrechung vol", 0)
    weitervol5=ReadPreferenceDouble("5. Flussunterbrechung vol", 0)
    weitervol6=ReadPreferenceDouble("6. Flussunterbrechung vol", 0)
    weitervol7=ReadPreferenceDouble("7. Flussunterbrechung vol", 0)
    weitervol8=ReadPreferenceDouble("8. Flussunterbrechung vol", 0)
    weitervol9=ReadPreferenceDouble("9. Flussunterbrechung vol", 0)
    weitervol10=ReadPreferenceDouble("10. Flussunterbrechung vol", 0)
    farbec=ReadPreferenceLong("Farbe C", RGB(255,100,100))
    farbes=ReadPreferenceLong("Farbe S", RGB(170,100,100))
    farbeseq=ReadPreferenceLong("Farbe Seq", RGB(170,170,100))
    farbedbk=ReadPreferenceLong("Farbe DBK", RGB(255,100,100))
    farbedfz_in=ReadPreferenceLong("Farbe DFZ in", RGB(100,100,200))
    farbedfz_ef=ReadPreferenceLong("Farbe DFZ in", RGB(100,100,200))
    farbevg=ReadPreferenceLong("Farbe VG", RGB(170,100,100))
    farbeimp=ReadPreferenceLong("Farbe Import", RGB(100,170,100))
    farbefrakt=ReadPreferenceLong("Farbe Fraktionen", RGB(0,0,0))
    farbelf=ReadPreferenceLong("Farbe Leitfhigkeit", RGB(130,130,130))
    farbespannung=ReadPreferenceLong("Farbe Spannung", RGB(0,0,0))
    farbestrom=ReadPreferenceLong("Farbe Strom", RGB(70,70,70))
    farbebac=ReadPreferenceLong("Farbe Bakterien", RGB(170,70,0))
    spannung_gesamt_init=ReadPreferenceDouble("angelegte Spannung", 10)
    spannungsabnahme1_init=ReadPreferenceDouble("Abnahmepunkt 1", 0)
    spannungsabnahme2_init=ReadPreferenceDouble("Abnahmepunkt 2", 15)
    porositaet_init=ReadPreferenceDouble("Porositt", 0.3)
    zementierungsfaktor_init=ReadPreferenceDouble("Zementierungsfaktor", 2)
    saettigung_init=ReadPreferenceDouble("Sttigung", 0.95)
    saettigungsexponent_init=ReadPreferenceDouble("Sttigungsexponent", 2)
    lfkorrelationskoeffizient_init=ReadPreferenceDouble("Leitfhigkeitskorrelationskoeffizient", 0.000001)
    temperaturkoeffizient_init=ReadPreferenceDouble("Temperaturkoeffizient", 0.02)
    usetemp_init=ReadPreferenceInteger("usetemp",0)
    hintergrund_init=ReadPreferenceDouble("Hintergrund", 0)
    abbau_1_init=ReadPreferenceDouble("Abbau_1", 0)
    produktion_init=ReadPreferenceDouble("Produktion", 0)
    background_init=ReadPreferenceDouble("Hintergrundlsung", 0)
    substrataff_init=ReadPreferenceDouble("Substrataffinitt", 0)
    wachstum_max_init=ReadPreferenceDouble("maximales Wachstum", 0)
    bakterienzahl_init_init=ReadPreferenceDouble("init. Bakterienzahl", 0)
    kleinepunkte=ReadPreferenceInteger("kleine Punkte", 0)
    temperature_factor=ReadPreferenceDouble("Temperaturfaktor", 1)
    cooling_speed=ReadPreferenceDouble("Abkhlungsgeschwindigkeit", 0.995)
    equil_time=ReadPreferenceInteger("Ausgleichszeit", 50)
    implicit=ReadPreferenceInteger("Implicit Euler",1)
    flux_conc=ReadPreferenceInteger("Flux Concentration",0)
    
    v=Q_init/(grundflaeche_init*theta_ges_init*(1-theta_im_anteil_init))
    long_Disp_init=dispersivity_init*v
    
    filefound=0
    ClosePreferences()
    
    set_colors()
    ProcedureReturn 1
  EndIf  
  
EndProcedure

Procedure save_parameters()  ; speichert Einstellungen
  
  temp.s
  ok.b
  ok=0
  
  temp=SaveFileRequester("Select Parameter File",directory+"new_parameters.ini","Initialisierungsdateien (*.ini)|*.ini|Alle Dateien (*.*)|*.*",0)
  If temp 
    directory=GetPathPart(temp)
    SetWindowTitle(0,"Parameter | "+directory)
  EndIf
  
  If SelectedFilePattern()=0 And Not GetExtensionPart(temp)="ini"
    temp+".ini"    
  EndIf
  
  If temp
    If ReadFile(0, temp)
      CloseFile(0)
      If MessageRequester("Warning","Overwrite "+GetFilePart(temp)+" ?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes
        If OpenPreferences(temp)
          ok=1        
        Else
          MessageRequester("Error","Could not open file")
        EndIf    
      Else 
        MessageRequester("Warning","Saving aborted")
      EndIf    
    Else
      If CreatePreferences(temp)
        ok=1
      Else
        MessageRequester("Error","Could not create file")
      EndIf        
    EndIf
    
    If ok
      
      WritePreferenceString("deltax", StrD(deltax,4))
      WritePreferenceString("deltat", StrD(deltat,4))
      WritePreferenceString("minx", StrD(minx,4))
      WritePreferenceString("maxx", StrD(maxx,4))
      WritePreferenceString("Querschnittsflche der Sule", StrD(grundflaeche,4))
      WritePreferenceString("Q", StrD(Q_start,4))
      WritePreferenceString("Diff", StrD(Diff,7))
      WritePreferenceString("dispersivity", StrD(dispersivity,4))
      WritePreferenceString("theta", StrD(theta_ges,4))
      WritePreferenceString("conc_vg", StrD(conc_vg_init,7))
      WritePreferenceString("vol_vg", StrD(vol_vg_start,4))
      WritePreferenceString("vol_dfz_in", StrD(vol_dfz_in,4))
      WritePreferenceString("vol_dfz_ef", StrD(vol_dfz_ef,4))
      WritePreferenceString("conc_dfz_in", StrD(conc_dfz_in_start,4))
      WritePreferenceString("conc_dfz_ef", StrD(conc_dfz_ef_start,4))      
      WritePreferenceString("fraction_theta_im", StrD(theta_im_anteil,7))
      WritePreferenceString("mass_transfer_im", StrD(mass_trans_im,7))      
      WritePreferenceString("evaporation", StrD(verdunstung,7))
      WritePreferenceString("Fraktionsdauer", StrD(frakt_deltat_start,4))
      WritePreferenceString("lagerungsdichte", StrD(lagerungsdichte,4))
      WritePreferenceString("kr", StrD(kr,7))
      WritePreferenceString("Kd", StrD(Kd,4))
      WritePreferenceString("freund_n", StrD(freund_n,4))
      WritePreferenceString("Kd_eq", StrD(Kd_eq,4))
      WritePreferenceString("freund_n_eq", StrD(freund_n_eq,4))
      WritePreferenceString("Verteilung", StrD(Verteilung,4))
      WritePreferenceInteger("drawvg", drawvg)
      WritePreferenceInteger("drawdbk", drawdbk)
      WritePreferenceInteger("drawconc", drawconc)
      WritePreferenceInteger("drawS", drawS)
      WritePreferenceInteger("drawSeq", drawSeq)
      WritePreferenceInteger("drawimport", drawimport)
      WritePreferenceInteger("drawdfz_in", drawdfz_in)
      WritePreferenceInteger("drawdfz_ef", drawdfz_ef)
      WritePreferenceInteger("drawfrakt", drawfrakt)
      WritePreferenceInteger("drawspannung", drawspannung)
      WritePreferenceInteger("drawstrom", drawstrom)
      WritePreferenceInteger("drawbac", drawbac)
      WritePreferenceInteger("drawfft", drawfft)
      WritePreferenceInteger("kleine Punkte", kleinepunkte)      
      WritePreferenceInteger("usesorption", usesorption)
      WritePreferenceInteger("usefittedisotherm", usefittedisotherm)
      WritePreferenceInteger("usefittedisothermeq", usefittedisothermeq)
      WritePreferenceInteger("usefittedleitfaehigkeit", usefittedlf)   
      WritePreferenceInteger("usevoltage", usevoltage)
      WritePreferenceInteger("converttoleitfaehigkeit", converttolf)
      WritePreferenceInteger("drawfi", drawflussunterbrechung)
      WritePreferenceInteger("sorptionmode", sorptionmode)
      WritePreferenceInteger("isotherme", isotherme)
      WritePreferenceInteger("kreislauf", kreislauf)
      WritePreferenceInteger("recorddbk", recorddbk)
      WritePreferenceString("dbkmaxtime", StrD(dbkmaxtime,4))
      WritePreferenceString("dbk_deltat", StrD(dbk_deltat,4))
      WritePreferenceString("haltezeit", StrD(haltezeit,4))
      WritePreferenceString("observation point", StrD(obspoint,4))
      WritePreferenceString("1. Flussunterbrechung Start",StrD(flussU_s1,4))
      WritePreferenceString("2. Flussunterbrechung Start",StrD(flussU_s2,4))
      WritePreferenceString("3. Flussunterbrechung Start",StrD(flussU_s3,4))
      WritePreferenceString("4. Flussunterbrechung Start",StrD(flussU_s4,4))
      WritePreferenceString("5. Flussunterbrechung Start",StrD(flussU_s5,4))
      WritePreferenceString("6. Flussunterbrechung Start",StrD(flussU_s6,4))
      WritePreferenceString("7. Flussunterbrechung Start",StrD(flussU_s7,4))
      WritePreferenceString("8. Flussunterbrechung Start",StrD(flussU_s8,4))
      WritePreferenceString("9. Flussunterbrechung Start",StrD(flussU_s9,4))
      WritePreferenceString("10. Flussunterbrechung Start",StrD(flussU_s10,4))
      WritePreferenceString("1. Flussunterbrechung Ende",StrD(flussU_e1,4))
      WritePreferenceString("2. Flussunterbrechung Ende",StrD(flussU_e2,4))
      WritePreferenceString("3. Flussunterbrechung Ende",StrD(flussU_e3,4))
      WritePreferenceString("4. Flussunterbrechung Ende",StrD(flussU_e4,4))
      WritePreferenceString("5. Flussunterbrechung Ende",StrD(flussU_e5,4))
      WritePreferenceString("6. Flussunterbrechung Ende",StrD(flussU_e6,4))
      WritePreferenceString("7. Flussunterbrechung Ende",StrD(flussU_e7,4))
      WritePreferenceString("8. Flussunterbrechung Ende",StrD(flussU_e8,4))
      WritePreferenceString("9. Flussunterbrechung Ende",StrD(flussU_e9,4))
      WritePreferenceString("10. Flussunterbrechung Ende",StrD(flussU_e10,4))
      WritePreferenceString("1. Flussunterbrechung Q",StrD(weiterQ1,4))
      WritePreferenceString("2. Flussunterbrechung Q",StrD(weiterQ2,4))
      WritePreferenceString("3. Flussunterbrechung Q",StrD(weiterQ3,4))
      WritePreferenceString("4. Flussunterbrechung Q",StrD(weiterQ4,4))
      WritePreferenceString("5. Flussunterbrechung Q",StrD(weiterQ5,4))
      WritePreferenceString("6. Flussunterbrechung Q",StrD(weiterQ6,4))
      WritePreferenceString("7. Flussunterbrechung Q",StrD(weiterQ7,4))
      WritePreferenceString("8. Flussunterbrechung Q",StrD(weiterQ8,4))
      WritePreferenceString("9. Flussunterbrechung Q",StrD(weiterQ9,4))
      WritePreferenceString("10. Flussunterbrechung Q",StrD(weiterQ10,4))
      WritePreferenceString("1. Flussunterbrechung c",StrD(weiterc1,4))
      WritePreferenceString("2. Flussunterbrechung c",StrD(weiterc2,4))
      WritePreferenceString("3. Flussunterbrechung c",StrD(weiterc3,4))
      WritePreferenceString("4. Flussunterbrechung c",StrD(weiterc4,4))
      WritePreferenceString("5. Flussunterbrechung c",StrD(weiterc5,4))
      WritePreferenceString("6. Flussunterbrechung c",StrD(weiterc6,4))
      WritePreferenceString("7. Flussunterbrechung c",StrD(weiterc7,4))
      WritePreferenceString("8. Flussunterbrechung c",StrD(weiterc8,4))
      WritePreferenceString("9. Flussunterbrechung c",StrD(weiterc9,4))
      WritePreferenceString("10. Flussunterbrechung c",StrD(weiterc10,4))
      WritePreferenceString("1. Flussunterbrechung f",StrD(weiterf1,4))
      WritePreferenceString("2. Flussunterbrechung f",StrD(weiterf2,4))
      WritePreferenceString("3. Flussunterbrechung f",StrD(weiterf3,4))
      WritePreferenceString("4. Flussunterbrechung f",StrD(weiterf4,4))
      WritePreferenceString("5. Flussunterbrechung f",StrD(weiterf5,4))
      WritePreferenceString("6. Flussunterbrechung f",StrD(weiterf6,4))
      WritePreferenceString("7. Flussunterbrechung f",StrD(weiterf7,4))
      WritePreferenceString("8. Flussunterbrechung f",StrD(weiterf8,4))
      WritePreferenceString("9. Flussunterbrechung f",StrD(weiterf9,4))
      WritePreferenceString("10. Flussunterbrechung f",StrD(weiterf10,4))
      WritePreferenceString("1. Flussunterbrechung vol",StrD(weitervol1,4))
      WritePreferenceString("2. Flussunterbrechung vol",StrD(weitervol2,4))
      WritePreferenceString("3. Flussunterbrechung vol",StrD(weitervol3,4))
      WritePreferenceString("4. Flussunterbrechung vol",StrD(weitervol4,4))
      WritePreferenceString("5. Flussunterbrechung vol",StrD(weitervol5,4))
      WritePreferenceString("6. Flussunterbrechung vol",StrD(weitervol6,4))
      WritePreferenceString("7. Flussunterbrechung vol",StrD(weitervol7,4))
      WritePreferenceString("8. Flussunterbrechung vol",StrD(weitervol8,4))
      WritePreferenceString("9. Flussunterbrechung vol",StrD(weitervol9,4))
      WritePreferenceString("10. Flussunterbrechung vol",StrD(weitervol10,4))
      WritePreferenceLong("Farbe C",farbec)
      WritePreferenceLong("Farbe S",farbes)
      WritePreferenceLong("Farbe Seq",farbeseq)
      WritePreferenceLong("Farbe DBK",farbedbk)
      WritePreferenceLong("Farbe DFZ in",farbedfz_in)
      WritePreferenceLong("Farbe DFZ ef",farbedfz_ef)
      WritePreferenceLong("Farbe VG",farbevg)
      WritePreferenceLong("Farbe Import",farbeimp)
      WritePreferenceLong("Farbe Fraktionen",farbefrakt)
      WritePreferenceLong("Farbe Leitfhigkeit",farbelf)
      WritePreferenceLong("Farbe Spannung",farbespannung)
      WritePreferenceLong("Farbe Strom",farbestrom)
      WritePreferenceLong("Farbe Bakterien",farbebac)
      WritePreferenceString("angelegte Spannung",StrD(spannung_gesamt,4))
      WritePreferenceString("Abnahmepunkt 1",StrD(spannungsabnahme1,4))
      WritePreferenceString("Abnahmepunkt 2",StrD(spannungsabnahme2,4))
      WritePreferenceString("Porositt",StrD(porositaet,4))
      WritePreferenceString("Zementierungsfaktor",StrD(zementierungsfaktor,4))
      WritePreferenceString("Sttigung",StrD(saettigung,4))
      WritePreferenceString("Sttigungsexponent",StrD(saettigungsexponent,4))
      WritePreferenceString("Temperaturkoeffizient",StrD(temperaturkoeffizient,4))
      WritePreferenceString("Leitfhigkeitskorrelationskoeffizient",StrD(lfkorrelationskoeffizient,7))
      WritePreferenceInteger("usetemp",usetemp)
      WritePreferenceString("Hintergrund",StrD(hintergrund,4))
      WritePreferenceString("Abbau_1",StrD(abbau_1,9))
      WritePreferenceString("Produktion",StrD(produktion,9))  
      WritePreferenceString("Hintergrundlsung",StrD(background,9))
      WritePreferenceString("Substrataffinitt",StrD(substrataff,9))
      WritePreferenceString("maximales Wachstum",StrD(wachstum_max,9))
      WritePreferenceString("init. Bakterienzahl",StrD(bakterienzahl_init,9))
      WritePreferenceDouble("Temperaturfaktor", temperature_factor)
      WritePreferenceDouble("Abkhlungsgeschwindigkeit", cooling_speed)
      WritePreferenceInteger("Ausgleichszeit", equil_time)
      WritePreferenceInteger("Implicit Euler",implicit)
      WritePreferenceInteger("Flux Concentration",flux_conc)
      ClosePreferences()
      MessageRequester("Information","Saved "+GetFilePart(temp))
    EndIf
    
  EndIf  
  
EndProcedure

Procedure startwerte()  ; setzen aktueller variablen auf init-varibalen
  
  deltax=deltax_init
  deltat=deltat_init
  minx=minx_init
  maxx=maxx_init
  Q_start=Q_init
  Q=Q_init
  v=Q_start/(grundflaeche_init*theta_init)
  Diff=Diff_init
  dispersivity=dispersivity_init
  long_Disp=v*dispersivity
  conc_vg_init=conc_vg_init_init
  conc_dfz_in_start=conc_dfz_in_init
  conc_dfz_ef_start=conc_dfz_ef_init
  theta_im_anteil=theta_im_anteil_init
  mass_trans_im=mass_trans_im_init
  verdunstung=verdunstung_init
  vol_vg_start=vol_vg_init
  vol_vg=vol_vg_start
  vol_dfz_in=vol_dfz_in_init
  vol_dfz_ef=vol_dfz_ef_init
  frakt_deltat_start=frakt_deltat_init
  frakt_deltat=frakt_deltat_start
  kr=kr_init
  Kd=Kd_init
  freund_n=freund_n_init
  Kd_eq=Kd_eq_init
  freund_n_eq=freund_n_eq_init
  verteilung=verteilung_init
  drawvg=drawvg_init
  drawdbk=drawdbk_init
  drawconc=drawconc_init
  drawS=drawS_init
  drawSeq=drawSeq_init
  drawimport=drawimport_init
  drawdfz_in=drawdfz_in_init
  drawdfz_ef=drawdfz_ef_init
  drawfrakt=drawfrakt_init
  drawspannung=drawspannung_init
  drawstrom=drawstrom_init
  drawbac=drawbac_init
  drawfft=drawfft_init
  background=background_init
  
  usesorption=usesorption_init
  usefittedisotherm=usefittedisotherm_init
  usefittedisothermeq=usefittedisothermeq_init
  usefittedlf=usefittedlf_init
  usevoltage=usevoltage_init
  usetemp=usetemp_init
  converttolf=converttolf_init
  drawflussunterbrechung=drawflussunterbrechung_init
  sorptionmode=sorptionmode_init
  isotherme=isotherme_init
  kreislauf=kreislauf_init
  recorddbk=recorddbk_init
  dbkmaxtime=dbkmaxtime_init
  bound_low=0
  bound_up=dbkmaxtime
  haltezeit=haltezeit_init
  dbk_deltat=dbk_deltat_init
  conc_vg_init=conc_vg_init_init
  obspoint=obspoint_init
  theta_ges=theta_ges_init
  theta=theta_ges*(1-theta_im_anteil)
  theta_im=theta_ges*theta_im_anteil
  lagerungsdichte=lagerungsdichte_init
  grundflaeche=grundflaeche_init
  spannung_gesamt=spannung_gesamt_init
  spannungsabnahme1=spannungsabnahme1_init
  spannungsabnahme2=spannungsabnahme2_init
  porositaet=porositaet_init
  zementierungsfaktor=zementierungsfaktor_init
  saettigung=saettigung_init
  saettigungsexponent=saettigungsexponent_init
  temperaturkoeffizient=temperaturkoeffizient_init
  lfkorrelationskoeffizient=lfkorrelationskoeffizient_init
  hintergrund=hintergrund_init
  abbau_1=abbau_1_init
  produktion=produktion_init
  wachstum_max=wachstum_max_init
  substrataff=substrataff_init
  bakterienzahl_init=bakterienzahl_init_init
  
  SetGadgetText(#String_deltax,StrD(deltax,4))
  SetGadgetText(#String_deltat,StrD(deltat,4))
  SetGadgetText(#String_minx,StrD(minx,4))
  SetGadgetText(#String_maxx,StrD(maxx,4))
  SetGadgetText(#String_Grundflaeche,StrD(grundflaeche,4))
  SetGadgetText(#String_Q,StrD(Q_start,4))
  SetGadgetText(#String_Diff,StrD(Diff,7))
  SetGadgetText(#String_dispersivity,StrD(dispersivity,4))
  SetGadgetText(#String_theta,StrD(theta_ges_init,4))
  SetGadgetText(#String_conc_vg,StrD(conc_vg_init,7))
  SetGadgetText(#String_conc_DFZ_in,StrD(conc_dfz_in_start,4))
  SetGadgetText(#String_conc_DFZ_ef,StrD(conc_dfz_ef_start,4))
  SetGadgetText(#String_theta_immobile,StrD(theta_im_anteil,7))
  SetGadgetText(#String_massentransfer_immobile,StrD(mass_trans_im,7))
  SetGadgetText(#String_dbkmaxtime,StrD(dbkmaxtime,4))
  SetGadgetText(#String_dbk_deltat,StrD(dbk_deltat,4))
  SetGadgetText(#String_vol_vg,StrD(vol_vg_start,4))
  SetGadgetText(#String_vol_DFZ_in,StrD(vol_dfz_in,4))
  SetGadgetText(#String_vol_DFZ_ef,StrD(vol_dfz_ef,4))
  SetGadgetText(#String_Verdunstung,StrD(verdunstung,7))
  SetGadgetText(#String_Fraktionsdauer,StrD(frakt_deltat_start,4))
  SetGadgetText(#String_Lagerungsdichte,StrD(lagerungsdichte,4))
  SetGadgetText(#String_kr,StrD(kr,7))
  SetGadgetText(#String_Kd,StrD(Kd,4))
  SetGadgetText(#String_freund_n,StrD(freund_n,4))
  SetGadgetText(#String_Kd_eq,StrD(Kd_eq,4))
  SetGadgetText(#String_freund_n_eq,StrD(freund_n_eq,4))
  SetGadgetText(#String_verteilung,StrD(verteilung,5))
  SetGadgetText(#String_haltezeit,StrD(haltezeit,4))
  SetGadgetText(#String_obspoint,StrD(obspoint,2))
  SetGadgetText(#String_flussunterbrechung_s1,StrD(flussU_s1,2))
  SetGadgetText(#String_flussunterbrechung_s2,StrD(flussU_s2,2))
  SetGadgetText(#String_flussunterbrechung_s3,StrD(flussU_s3,2))
  SetGadgetText(#String_flussunterbrechung_s4,StrD(flussU_s4,2))
  SetGadgetText(#String_flussunterbrechung_s5,StrD(flussU_s5,2))
  SetGadgetText(#String_flussunterbrechung_s6,StrD(flussU_s6,2))
  SetGadgetText(#String_flussunterbrechung_s7,StrD(flussU_s7,2))
  SetGadgetText(#String_flussunterbrechung_s8,StrD(flussU_s8,2))
  SetGadgetText(#String_flussunterbrechung_s9,StrD(flussU_s9,2))
  SetGadgetText(#String_flussunterbrechung_s10,StrD(flussU_s10,2))
  SetGadgetText(#String_flussunterbrechung_e1,StrD(flussU_e1,2))
  SetGadgetText(#String_flussunterbrechung_e2,StrD(flussU_e2,2))
  SetGadgetText(#String_flussunterbrechung_e3,StrD(flussU_e3,2))
  SetGadgetText(#String_flussunterbrechung_e4,StrD(flussU_e4,2))
  SetGadgetText(#String_flussunterbrechung_e5,StrD(flussU_e5,2))
  SetGadgetText(#String_flussunterbrechung_e6,StrD(flussU_e6,2))
  SetGadgetText(#String_flussunterbrechung_e7,StrD(flussU_e7,2))
  SetGadgetText(#String_flussunterbrechung_e8,StrD(flussU_e8,2))
  SetGadgetText(#String_flussunterbrechung_e9,StrD(flussU_e9,2))
  SetGadgetText(#String_flussunterbrechung_e10,StrD(flussU_e10,2))
  SetGadgetText(#String_weiterQ1,StrD(weiterQ1,4))
  SetGadgetText(#String_weiterQ2,StrD(weiterQ2,4))
  SetGadgetText(#String_weiterQ3,StrD(weiterQ3,4))
  SetGadgetText(#String_weiterQ4,StrD(weiterQ4,4))
  SetGadgetText(#String_weiterQ5,StrD(weiterQ5,4))
  SetGadgetText(#String_weiterQ6,StrD(weiterQ6,4))
  SetGadgetText(#String_weiterQ7,StrD(weiterQ7,4))
  SetGadgetText(#String_weiterQ8,StrD(weiterQ8,4))
  SetGadgetText(#String_weiterQ9,StrD(weiterQ9,4))
  SetGadgetText(#String_weiterQ10,StrD(weiterQ10,4))
  SetGadgetText(#String_weiterc1,StrD(weiterc1,4))
  SetGadgetText(#String_weiterc2,StrD(weiterc2,4))
  SetGadgetText(#String_weiterc3,StrD(weiterc3,4))
  SetGadgetText(#String_weiterc4,StrD(weiterc4,4))
  SetGadgetText(#String_weiterc5,StrD(weiterc5,4))
  SetGadgetText(#String_weiterc6,StrD(weiterc6,4))
  SetGadgetText(#String_weiterc7,StrD(weiterc7,4))
  SetGadgetText(#String_weiterc8,StrD(weiterc8,4))
  SetGadgetText(#String_weiterc9,StrD(weiterc9,4))
  SetGadgetText(#String_weiterc10,StrD(weiterc10,4))
  SetGadgetText(#String_weiterf1,StrD(weiterf1,2))
  SetGadgetText(#String_weiterf2,StrD(weiterf2,2))
  SetGadgetText(#String_weiterf3,StrD(weiterf3,2))
  SetGadgetText(#String_weiterf4,StrD(weiterf4,2))
  SetGadgetText(#String_weiterf5,StrD(weiterf5,2))
  SetGadgetText(#String_weiterf6,StrD(weiterf6,2))
  SetGadgetText(#String_weiterf7,StrD(weiterf7,2))
  SetGadgetText(#String_weiterf8,StrD(weiterf8,2))
  SetGadgetText(#String_weiterf9,StrD(weiterf9,2))
  SetGadgetText(#String_weiterf10,StrD(weiterf10,2))
  SetGadgetText(#String_weitervol1,StrD(weitervol1,2))
  SetGadgetText(#String_weitervol2,StrD(weitervol2,2))
  SetGadgetText(#String_weitervol3,StrD(weitervol3,2))
  SetGadgetText(#String_weitervol4,StrD(weitervol4,2))
  SetGadgetText(#String_weitervol5,StrD(weitervol5,2))
  SetGadgetText(#String_weitervol6,StrD(weitervol6,2))
  SetGadgetText(#String_weitervol7,StrD(weitervol7,2))
  SetGadgetText(#String_weitervol8,StrD(weitervol8,2))
  SetGadgetText(#String_weitervol9,StrD(weitervol9,2))
  SetGadgetText(#String_weitervol10,StrD(weitervol10,2))
  SetGadgetText(#String_Abbau_1,StrD(abbau_1,9))
  SetGadgetText(#String_Produktion,StrD(produktion,9))
  SetGadgetText(#String_Wachstum_max,StrD(wachstum_max,9))
  SetGadgetText(#String_Substrataff,StrD(substrataff,9))
  SetGadgetText(#String_Bakterienzahl_init,StrD(bakterienzahl_init,9))
  SetGadgetText(#String_background,StrD(background,9))
  SetGadgetState(#CheckBox_drawconc,drawconc)
  SetGadgetState(#CheckBox_drawS,drawS)
  SetGadgetState(#CheckBox_drawSeq,drawSeq)
  SetGadgetState(#CheckBox_drawDBK,drawdbk)
  SetGadgetState(#CheckBox_drawvg,drawvg)
  SetGadgetState(#CheckBox_kreislauf,kreislauf)
  SetGadgetState(#CheckBox_recordDBK,recorddbk)
  SetGadgetState(#CheckBox_drawimport,drawimport)
  SetGadgetState(#CheckBox_drawdfz_in,drawdfz_in)
  SetGadgetState(#CheckBox_drawdfz_ef,drawdfz_ef)
  SetGadgetState(#CheckBox_drawfrakt,drawfrakt)
  SetGadgetState(#CheckBox_drawspannung,drawspannung)
  SetGadgetState(#CheckBox_drawstrom,drawstrom)
  SetGadgetState(#CheckBox_drawbac,drawbac)
  SetGadgetState(#CheckBox_kleinePunkte,kleinepunkte)
  SetGadgetState(#CheckBox_drawflussunterbrechung,drawflussunterbrechung)
  SetGadgetState(#CheckBox_usesorption,usesorption)
  SetGadgetState(#CheckBox_usefittedisotherm,usefittedisotherm)
  SetGadgetState(#CheckBox_usefittedisothermeq,usefittedisothermeq)
  SetGadgetState(#CheckBox_usefittedlf,usefittedlf)
  SetGadgetState(#CheckBox_usevoltage,usevoltage)
  SetGadgetState(#CheckBox_usetemp,usetemp)
  SetGadgetState(#CheckBox_converttolf,converttolf)
  SetGadgetState((#Radio_normalsorption-1+sorptionmode),1)
  SetGadgetState((#Radio_Isotherme_freund-1+isotherme),1)
  SetGadgetText(#String_Spannung,StrD(spannung_gesamt,4))
  SetGadgetText(#String_Abnahme1,StrD(spannungsabnahme1,4))
  SetGadgetText(#String_Abnahme2,StrD(spannungsabnahme2,4))
  SetGadgetText(#String_Porositaet,StrD(porositaet,4))
  SetGadgetText(#String_Zementierungsfaktor,StrD(zementierungsfaktor,4))
  SetGadgetText(#String_Saettigung,StrD(saettigung,4))
  SetGadgetText(#String_Saettigungsexponent,StrD(saettigungsexponent,4))
  SetGadgetText(#String_temperaturkoeffizient,StrD(temperaturkoeffizient,4))
  SetGadgetText(#String_LFKorrelationskoeffizient,StrD(lfkorrelationskoeffizient,7))
  
  ;If IsWindow(1)
  ;  ResizeWindow(1,0,0,1280,635)
  ;EndIf
  
  If IsWindow(2)
    SetGadgetText(#String_iterationsstart,StrD(iterationsstart,9))
    SetGadgetText(#String_iterationsende,StrD(iterationsende,9))
    SetGadgetState(#Radio_singleinversion-1+inversionmode,1)
    SetGadgetText(#String_cooling_speed,StrD(cooling_speed,4))
    SetGadgetText(#String_temperature_factor,StrD(temperature_factor,4))
    SetGadgetText(#String_equil_time,Str(equil_time))
    SetGadgetText(#String_norm,StrD(norm))
  EndIf
  
EndProcedure

Procedure transfer_boxes_to_variable()  ; bertrgt werte der Felder nach nderung auf aktuelle Variablen
  
  Q_start=ValD(GetGadgetText(#String_Q))
  vol_vg_start=ValD(GetGadgetText(#String_vol_vg))
  frakt_deltat_start=ValD(GetGadgetText(#String_Fraktionsdauer))
  conc_vg_init=ValD(GetGadgetText(#String_conc_vg))
  sigma=ValD(GetGadgetText(#String_sigma))
  deltax=ValD(GetGadgetText(#String_deltax)) 
  deltat=ValD(GetGadgetText(#String_deltat)) 
  minx=ValD(GetGadgetText(#String_minx)) 
  maxx=ValD(GetGadgetText(#String_maxx)) 
  grundflaeche=ValD(GetGadgetText(#String_Grundflaeche))
  Diff=ValD(GetGadgetText(#String_Diff))
  dispersivity=ValD(GetGadgetText(#String_dispersivity))
  mass_trans_im=ValD(GetGadgetText(#String_massentransfer_immobile))
  theta_im_anteil=ValD(GetGadgetText(#String_theta_immobile))
  theta_ges=ValD(GetGadgetText(#String_theta))
  theta=theta_ges*(1-theta_im_anteil)
  theta_im=theta_ges*theta_im_anteil
  conc_dfz_in_start=ValD(GetGadgetText(#String_conc_DFZ_in))
  conc_dfz_ef_start=ValD(GetGadgetText(#String_conc_DFZ_ef))
  verdunstung=ValD(GetGadgetText(#String_Verdunstung))
  dbkmaxtime=ValD(GetGadgetText(#String_dbkmaxtime)) 
  dbk_deltat=ValD(GetGadgetText(#String_dbk_deltat))  
  vol_dfz_in=ValD(GetGadgetText(#String_vol_dfz_in))
  vol_dfz_ef=ValD(GetGadgetText(#String_vol_dfz_ef))  
  lagerungsdichte=ValD(GetGadgetText(#String_Lagerungsdichte))
  kr=ValD(GetGadgetText(#String_kr))
  Kd=ValD(GetGadgetText(#String_Kd))
  freund_n=ValD(GetGadgetText(#String_freund_n))
  Kd_eq=ValD(GetGadgetText(#String_Kd_eq))
  freund_n_eq=ValD(GetGadgetText(#String_freund_n_eq))
  verteilung=ValD(GetGadgetText(#String_verteilung))
  haltezeit=ValD(GetGadgetText(#String_haltezeit))
  obspoint=ValD(GetGadgetText(#String_obspoint))
  drawconc=GetGadgetState(#CheckBox_drawconc)
  drawS=GetGadgetState(#CheckBox_drawS)
  drawSeq=GetGadgetState(#CheckBox_drawSeq)
  drawdbk=GetGadgetState(#CheckBox_drawDBK)
  drawvg=GetGadgetState(#CheckBox_drawvg)
  drawspannung=GetGadgetState(#CheckBox_drawspannung)
  drawstrom=GetGadgetState(#CheckBox_drawstrom)
  drawfft=GetGadgetState(#CheckBox_drawfft)
  kreislauf=GetGadgetState(#CheckBox_kreislauf)
  recorddbk=GetGadgetState(#CheckBox_recordDBK)
  implicit=GetGadgetState(#CheckBox_implicit_euler)
  addnoise=GetGadgetState(#CheckBox_addnoise) 
  drawflussunterbrechung=GetGadgetState(#CheckBox_drawflussunterbrechung)
  drawimport=GetGadgetState(#CheckBox_drawimport)
  drawdfz_in=GetGadgetState(#CheckBox_drawdfz_in)
  drawdfz_ef=GetGadgetState(#CheckBox_drawdfz_ef)
  drawfrakt=GetGadgetState(#CheckBox_drawfrakt)
  drawbac=GetGadgetState(#CheckBox_drawbac)
  kleinepunkte=GetGadgetState(#CheckBox_kleinePunkte)
  usesorption=GetGadgetState(#CheckBox_usesorption)
  usefittedisotherm=GetGadgetState(#CheckBox_usefittedisotherm)
  usefittedisothermeq=GetGadgetState(#CheckBox_usefittedisothermeq)
  usefittedlf=GetGadgetState(#CheckBox_usefittedlf)
  usevoltage=GetGadgetState(#CheckBox_usevoltage)
  converttolf=GetGadgetState(#CheckBox_converttolf)
  flux_conc=GetGadgetState(#Radio_flux_conc)
  sorptionmode=GetGadgetState(#Radio_normalsorption)+GetGadgetState(#Radio_newton)*2
  isotherme=GetGadgetState(#Radio_Isotherme_freund)+GetGadgetState(#Radio_Isotherme_langmuir)*2
  spannung_gesamt=ValD(GetGadgetText(#String_Spannung))
  spannungsabnahme1=ValD(GetGadgetText(#String_Abnahme1))
  spannungsabnahme2=ValD(GetGadgetText(#String_Abnahme2))
  porositaet=ValD(GetGadgetText(#String_Porositaet))
  zementierungsfaktor=ValD(GetGadgetText(#String_Zementierungsfaktor))
  saettigung=ValD(GetGadgetText(#String_Saettigung))
  saettigungsexponent=ValD(GetGadgetText(#String_Saettigungsexponent))
  temperaturkoeffizient=ValD(GetGadgetText(#String_temperaturkoeffizient))
  lfkorrelationskoeffizient=ValD(GetGadgetText(#String_LFKorrelationskoeffizient))
  usetemp=GetGadgetState(#CheckBox_usetemp)
  flussU_s1=ValD(GetGadgetText(#String_flussunterbrechung_s1))
  flussU_s2=ValD(GetGadgetText(#String_flussunterbrechung_s2))
  flussU_s3=ValD(GetGadgetText(#String_flussunterbrechung_s3))
  flussU_s4=ValD(GetGadgetText(#String_flussunterbrechung_s4))
  flussU_s5=ValD(GetGadgetText(#String_flussunterbrechung_s5))
  flussU_s6=ValD(GetGadgetText(#String_flussunterbrechung_s6))
  flussU_s7=ValD(GetGadgetText(#String_flussunterbrechung_s7))
  flussU_s8=ValD(GetGadgetText(#String_flussunterbrechung_s8))
  flussU_s9=ValD(GetGadgetText(#String_flussunterbrechung_s9))
  flussU_s10=ValD(GetGadgetText(#String_flussunterbrechung_s10))
  flussU_e1=ValD(GetGadgetText(#String_flussunterbrechung_e1))
  flussU_e2=ValD(GetGadgetText(#String_flussunterbrechung_e2))
  flussU_e3=ValD(GetGadgetText(#String_flussunterbrechung_e3))
  flussU_e4=ValD(GetGadgetText(#String_flussunterbrechung_e4))
  flussU_e5=ValD(GetGadgetText(#String_flussunterbrechung_e5))
  flussU_e6=ValD(GetGadgetText(#String_flussunterbrechung_e6))
  flussU_e7=ValD(GetGadgetText(#String_flussunterbrechung_e7))
  flussU_e8=ValD(GetGadgetText(#String_flussunterbrechung_e8))
  flussU_e9=ValD(GetGadgetText(#String_flussunterbrechung_e9))
  flussU_e10=ValD(GetGadgetText(#String_flussunterbrechung_e10))
  weiterQ1=ValD(GetGadgetText(#String_weiterQ1))
  weiterQ2=ValD(GetGadgetText(#String_weiterQ2))
  weiterQ3=ValD(GetGadgetText(#String_weiterQ3))
  weiterQ4=ValD(GetGadgetText(#String_weiterQ4))
  weiterQ5=ValD(GetGadgetText(#String_weiterQ5))
  weiterQ6=ValD(GetGadgetText(#String_weiterQ6))
  weiterQ7=ValD(GetGadgetText(#String_weiterQ7))
  weiterQ8=ValD(GetGadgetText(#String_weiterQ8))
  weiterQ9=ValD(GetGadgetText(#String_weiterQ9))
  weiterQ10=ValD(GetGadgetText(#String_weiterQ10))
  weiterc1=ValD(GetGadgetText(#String_weiterc1))
  weiterc2=ValD(GetGadgetText(#String_weiterc2))
  weiterc3=ValD(GetGadgetText(#String_weiterc3))
  weiterc4=ValD(GetGadgetText(#String_weiterc4))
  weiterc5=ValD(GetGadgetText(#String_weiterc5))
  weiterc6=ValD(GetGadgetText(#String_weiterc6))
  weiterc7=ValD(GetGadgetText(#String_weiterc7))
  weiterc8=ValD(GetGadgetText(#String_weiterc8))
  weiterc9=ValD(GetGadgetText(#String_weiterc9))
  weiterc10=ValD(GetGadgetText(#String_weiterc10))
  weiterf1=ValD(GetGadgetText(#String_weiterf1))
  weiterf2=ValD(GetGadgetText(#String_weiterf2))
  weiterf3=ValD(GetGadgetText(#String_weiterf3))
  weiterf4=ValD(GetGadgetText(#String_weiterf4))
  weiterf5=ValD(GetGadgetText(#String_weiterf5))
  weiterf6=ValD(GetGadgetText(#String_weiterf6))
  weiterf7=ValD(GetGadgetText(#String_weiterf7))
  weiterf8=ValD(GetGadgetText(#String_weiterf8))
  weiterf9=ValD(GetGadgetText(#String_weiterf9))
  weiterf10=ValD(GetGadgetText(#String_weiterf10))
  weitervol1=ValD(GetGadgetText(#String_weitervol1))
  weitervol2=ValD(GetGadgetText(#String_weitervol2))
  weitervol3=ValD(GetGadgetText(#String_weitervol3))
  weitervol4=ValD(GetGadgetText(#String_weitervol4))
  weitervol5=ValD(GetGadgetText(#String_weitervol5))
  weitervol6=ValD(GetGadgetText(#String_weitervol6))
  weitervol7=ValD(GetGadgetText(#String_weitervol7))
  weitervol8=ValD(GetGadgetText(#String_weitervol8))
  weitervol9=ValD(GetGadgetText(#String_weitervol9))
  weitervol10=ValD(GetGadgetText(#String_weitervol10))
  abbau_1=ValD(GetGadgetText(#String_Abbau_1))
  produktion=ValD(GetGadgetText(#String_Produktion))
  background=ValD(GetGadgetText(#String_background))
  wachstum_max=ValD(GetGadgetText(#String_Wachstum_max))
  substrataff=ValD(GetGadgetText(#String_Substrataff))
  bakterienzahl_init=ValD(GetGadgetText(#String_Bakterienzahl_init))
  selected_curve_for_FFT=GetGadgetState(#Combo_FFT)
    
  If Not (isotherme=isotherme_alt)
    isotherme_alt=isotherme
    Select isotherme
      Case 1
        SetGadgetText(#Text_freund_n,"n")
        SetGadgetText(#Text_freund_n_eq,"n")
        HideGadget(#Radio_normalsorption,0)
        HideGadget(#Radio_newton,0)
        HideGadget(#Frame_NGG,0)
        If IsWindow(2)
          SetGadgetItemText(#Combo_Parameter_Inv, 6, "freundl. n eq")
          SetGadgetItemText(#Combo_Parameter_Inv, 7, "freundl. n neq")
          SetGadgetItemText(#ListIcon_Parameters, 6, Chr(10)+"freundl. n eq")
          SetGadgetItemText(#ListIcon_Parameters, 7, Chr(10)+"freundl. n neq")
        EndIf  
      Case 2
        SetGadgetText(#Text_freund_n,"S_max")
        SetGadgetText(#Text_freund_n_eq,"S_max")
        HideGadget(#Radio_normalsorption,1)
        HideGadget(#Radio_newton,1)
        HideGadget(#Frame_NGG,1)
        If IsWindow(2)
          SetGadgetItemText(#Combo_Parameter_Inv, 6, "max. S eq")
          SetGadgetItemText(#Combo_Parameter_Inv, 7, "max. S neq")
          SetGadgetItemText(#ListIcon_Parameters, 6, Chr(10)+"max. S eq")
          SetGadgetItemText(#ListIcon_Parameters, 7, Chr(10)+"max. S neq")
        EndIf  
        sorptionmode=2
    EndSelect    
  EndIf 
  
  If IsWindow(2)
    raster=Val(GetGadgetText(#Spin_Iterationsraster))
    tiefe=Val(GetGadgetText(#Spin_Iterationstiefe))
    steps1=Val(GetGadgetText(#Spin_Steps1))
    steps2=Val(GetGadgetText(#Spin_Steps2))
    inversionmode=GetGadgetState(#Radio_singleinversion)+GetGadgetState(#Radio_multipleinversion)*2+GetGadgetState(#Radio_SAinversion)*3+GetGadgetState(#Radio_sensitivity)*4
    iterationsstart=ValD(GetGadgetText(#String_iterationsstart))
    iterationsende=ValD(GetGadgetText(#String_iterationsende))
    iterationsstart2=ValD(GetGadgetText(#String_iterationsstart2))
    iterationsende2=ValD(GetGadgetText(#String_iterationsende2))
    last_inversion_parameter=GetGadgetState(#Combo_Parameter_Inv)
    last_inversion_parameter2=GetGadgetState(#Combo_Parameter_Inv2)
    last_inversion_curve=GetGadgetState(#Combo_SelectInv)
    cooling_speed=ValD(GetGadgetText(#String_cooling_speed))
    temperature_factor=ValD(GetGadgetText(#String_temperature_factor))
    equil_time=Val(GetGadgetText(#String_equil_time))
    norm=ValD(GetGadgetText(#String_norm))
    use_for_forward_prediction=GetGadgetState(#CheckBox_useforwardprediction)
    inv_log1=GetGadgetState(#CheckBox_inv_logsteps1)
    inv_log2=GetGadgetState(#CheckBox_inv_logsteps2)
    addnoise_to_forwardprediction=GetGadgetState(#CheckBox_noise_on_forwardprediction)
    
    If Not (inversionmode=inversionmode_alt) Or changed
      inversionmode_alt=inversionmode
      Select inversionmode
      Case 1
        HideGadget(#Text_iterationsende,0)
        HideGadget(#Text_iterationsstart,0)
        HideGadget(#Text_iterationsende2,1)
        HideGadget(#Text_iterationsstart2,1)
        HideGadget(#Text_Steps1,1)
        HideGadget(#Text_Steps2,1)
        HideGadget(#Spin_Steps1,1)
        HideGadget(#Spin_Steps2,1)
        HideGadget(#Text_iterationsstart2,1)
        HideGadget(#Text_iterationsraster,0)
        HideGadget(#Text_iterationstiefe,0)
        HideGadget(#Text_Parameter_Inv,0)
        HideGadget(#Text_Parameter_Inv2,1)
        HideGadget(#String_iterationsstart,0)
        HideGadget(#String_iterationsende,0)
        HideGadget(#String_iterationsstart2,1)
        HideGadget(#String_iterationsende2,1)
        HideGadget(#Combo_Parameter_Inv,0)
        HideGadget(#Combo_Parameter_Inv2,1)
        HideGadget(#Spin_Iterationsraster,0)
        HideGadget(#Spin_Iterationstiefe,0) 
        HideGadget(#ListIcon_Parameters,1)
        HideGadget(#Text_Inversionstiefe,1)
        HideGadget(#Spin_Inversionstiefe,1)
        HideGadget(#Text_cooling_speed,1)
        HideGadget(#String_cooling_speed,1)
        HideGadget(#Text_equil_time,1)
        HideGadget(#String_equil_time,1)
        HideGadget(#Text_temperature_factor,1)
        HideGadget(#String_temperature_factor,1)
        HideGadget(#CheckBox_useforwardprediction,1)
        HideGadget(#CheckBox_inv_logsteps1,1)
        HideGadget(#CheckBox_inv_logsteps2,1) 
        HideGadget(#CheckBox_noise_on_forwardprediction,1)
      Case 2
        HideGadget(#Text_iterationsende,1)
        HideGadget(#Text_iterationsstart,1)
        HideGadget(#Text_iterationsende2,1)
        HideGadget(#Text_iterationsstart2,1)
        HideGadget(#Text_Steps1,1)
        HideGadget(#Text_Steps2,1)
        HideGadget(#Spin_Steps1,1)
        HideGadget(#Spin_Steps2,1)
        HideGadget(#Text_iterationsraster,1)
        HideGadget(#Text_iterationstiefe,1)
        HideGadget(#Text_Parameter_Inv,1)
        HideGadget(#Text_Parameter_Inv2,1)
        HideGadget(#String_iterationsstart,1)
        HideGadget(#String_iterationsende,1)
        HideGadget(#String_iterationsstart2,1)
        HideGadget(#String_iterationsende2,1)
        HideGadget(#Combo_Parameter_Inv,1)
        HideGadget(#Combo_Parameter_Inv2,1)
        HideGadget(#Spin_Iterationsraster,1)
        HideGadget(#Spin_Iterationstiefe,1)
        HideGadget(#Text_Inversionstiefe,0)
        HideGadget(#ListIcon_Parameters,0)
        HideGadget(#Spin_Inversionstiefe,0)
        HideGadget(#Text_cooling_speed,1)
        HideGadget(#String_cooling_speed,1)
        HideGadget(#Text_equil_time,1)
        HideGadget(#String_equil_time,1)
        HideGadget(#Text_temperature_factor,1)
        HideGadget(#String_temperature_factor,1)
        HideGadget(#CheckBox_useforwardprediction,1)
        HideGadget(#CheckBox_inv_logsteps1,1)
        HideGadget(#CheckBox_inv_logsteps2,1)
        HideGadget(#CheckBox_noise_on_forwardprediction,1)
      Case 3
        HideGadget(#Text_iterationsende,1)
        HideGadget(#Text_iterationsstart,1)
        HideGadget(#Text_iterationsende2,1)
        HideGadget(#Text_iterationsstart2,1)
        HideGadget(#Text_Steps1,1)
        HideGadget(#Text_Steps2,1)
        HideGadget(#Spin_Steps1,1)
        HideGadget(#Spin_Steps2,1)
        HideGadget(#Text_iterationsraster,1)
        HideGadget(#Text_iterationstiefe,1)
        HideGadget(#Text_Parameter_Inv,1)
        HideGadget(#Text_Parameter_Inv2,1)
        HideGadget(#String_iterationsstart,1)
        HideGadget(#String_iterationsende,1)
        HideGadget(#String_iterationsstart2,1)
        HideGadget(#String_iterationsende2,1)
        HideGadget(#Combo_Parameter_Inv,1)
        HideGadget(#Combo_Parameter_Inv2,1)
        HideGadget(#Spin_Iterationsraster,1)
        HideGadget(#Spin_Iterationstiefe,1)
        HideGadget(#Text_Inversionstiefe,0)
        HideGadget(#ListIcon_Parameters,0)
        HideGadget(#Spin_Inversionstiefe,0)
        HideGadget(#Text_cooling_speed,0)
        HideGadget(#String_cooling_speed,0)
        HideGadget(#Text_equil_time,0)
        HideGadget(#String_equil_time,0)
        HideGadget(#Text_temperature_factor,0)
        HideGadget(#String_temperature_factor,0)
        HideGadget(#CheckBox_useforwardprediction,1)
        HideGadget(#CheckBox_inv_logsteps1,1)
        HideGadget(#CheckBox_inv_logsteps2,1)
        HideGadget(#CheckBox_noise_on_forwardprediction,1)
      Case 4
        HideGadget(#Text_iterationsende,0)
        HideGadget(#Text_iterationsstart,0)
        HideGadget(#Text_iterationsende2,0)
        HideGadget(#Text_iterationsstart2,0)
        HideGadget(#Text_Steps1,0)
        HideGadget(#Text_Steps2,0)
        HideGadget(#Spin_Steps1,0)
        HideGadget(#Spin_Steps2,0)
        HideGadget(#CheckBox_useforwardprediction,0)
        HideGadget(#Text_iterationsraster,1)
        HideGadget(#Text_iterationstiefe,1)
        HideGadget(#Text_Parameter_Inv,0)
        HideGadget(#Text_Parameter_Inv2,0)
        HideGadget(#String_iterationsstart,0)
        HideGadget(#String_iterationsende,0)
        HideGadget(#String_iterationsstart2,0)
        HideGadget(#String_iterationsende2,0)
        HideGadget(#Combo_Parameter_Inv,0)
        HideGadget(#Combo_Parameter_Inv2,0)
        HideGadget(#Spin_Iterationsraster,1)
        HideGadget(#Spin_Iterationstiefe,1)
        HideGadget(#Text_Inversionstiefe,1)
        HideGadget(#ListIcon_Parameters,1)
        HideGadget(#Spin_Inversionstiefe,1)
        HideGadget(#Text_cooling_speed,1)
        HideGadget(#String_cooling_speed,1)
        HideGadget(#Text_equil_time,1)
        HideGadget(#String_equil_time,1)
        HideGadget(#Text_temperature_factor,1)
        HideGadget(#String_temperature_factor,1)
        HideGadget(#CheckBox_inv_logsteps1,0)
        HideGadget(#CheckBox_inv_logsteps2,0) 
        HideGadget(#CheckBox_noise_on_forwardprediction,0)  
      EndSelect  
    EndIf 
    
  EndIf
  
  If IsWindow(3)
    batch_start=ValD(GetGadgetText(#String_sens_min))
    batch_end=ValD(GetGadgetText(#String_sens_max))
    sens_steps=GetGadgetState(#Spin_sens_steps)
    sens_log=GetGadgetState(#Checkbox_sens_logsteps)
    last_inversion_parameter_sens=GetGadgetState(#Combo_sens_parameter)
    last_inversion_curve_sens=GetGadgetState(#Combo_sens_selectbtc)
  EndIf  
  
  v=Q/(grundflaeche*theta)
  long_Disp=v*dispersivity
  
EndProcedure

Procedure check_values()  ; berprfung auf unsinnige Werte, die Fehler produzieren, nicht ganz vollstndig, wurde vernachlssigt
  
  If Not maxx-minx>0
    MessageRequester("Fehler", "Sulenlnge>0 angeben", #PB_MessageRequester_Ok)
    maxx=10
    minx=0
    SetGadgetText(#String_minx,StrD(minx,4))
    SetGadgetText(#String_maxx,StrD(maxx,4))
  EndIf
  
  If Not deltax>0 
    MessageRequester("Fehler", "Diskretisierung>0 angeben", #PB_MessageRequester_Ok)
    deltax=0.05
    SetGadgetText(#String_deltax,StrD(deltax,4))
  EndIf
  
  If Not grundflaeche>0
    MessageRequester("Fehler", "Flche der Sule >0 angeben", #PB_MessageRequester_Ok)
    grundflaeche=1
    SetGadgetText(#String_Grundflaeche,StrD(grundflaeche,4))
  EndIf
  
  If Not theta_im_anteil<1
    MessageRequester("Fehler", "Anteil im. Porenraum <1 angeben", #PB_MessageRequester_Ok)
    theta_im_anteil=0
    SetGadgetText(#String_theta_immobile,StrD(theta_im_anteil,7))
  EndIf  
  
  If Not deltax=deltax_alt And init_sucess
    MessageRequester("Warning","nderung von delta_x verflscht bereits berechnete Konzentrationsverteilungen")
    deltax_alt=deltax
  EndIf
  
  If Not dbk_deltat=dbk_deltat_alt And init_sucess
    MessageRequester("Warning","nderung von dbk_delta_t verflscht bereits berechnete Durchbruchskurven")
    dbk_deltat_alt=dbk_deltat
  EndIf
  
  If Not dbkmaxtime>0
    MessageRequester("Fehler", "DBK>0 angeben", #PB_MessageRequester_Ok)
    dbkmaxtime=100
    SetGadgetText(#String_dbkmaxtime,StrD(dbkmaxtime,4))
  EndIf
  
  If Not vol_vg>=0
    MessageRequester("Fehler", "positives VG angeben", #PB_MessageRequester_Ok)
    vol_vg=10
    SetGadgetText(#String_vol_vg,StrD(vol_vg,4))
  EndIf
  
  If conc_vg_init<0
    MessageRequester("Fehler", "positive Konzentration angeben", #PB_MessageRequester_Ok)
    conc_vg_init=1
    SetGadgetText(#String_conc_vg,StrD(conc_vg_init,7))    
  EndIf
  
  ;If Diff<0
  ;  MessageRequester("Fehler", "positiven Diffusionskoeffizienten angeben", #PB_MessageRequester_Ok)
  ;  Diff=0.06
  ;  SetGadgetText(#String_Diff,StrD(Diff,4))    
  ;EndIf
  
  If verteilung>1 Or verteilung<0
    MessageRequester("Fehler", "Verteilung von 0 bis 1 angeben", #PB_MessageRequester_Ok)
    verteilung=1
    SetGadgetText(#String_verteilung,StrD(verteilung,5))    
  EndIf  
  
  If Not dbk_deltat>0
    MessageRequester("Fehler", "Diskretisierung>0 angeben", #PB_MessageRequester_Ok)
    dbk_deltat=(dbkmaxtime)/560
    SetGadgetText(#String_dbk_deltat,StrD(dbk_deltat,4))
  EndIf
  
  If deltat<0
    MessageRequester("Fehler", "positven Zeitschritt angeben", #PB_MessageRequester_Ok)
    deltat=0.01
    SetGadgetText(#String_deltat,StrD(deltat,4))
  EndIf
  
  If theta_ges>1 Or Not theta_ges>0
    MessageRequester("Fehler", "Theta >0 bis 1 angeben", #PB_MessageRequester_Ok)
    theta_ges=0.5
    SetGadgetText(#String_theta,StrD(theta_ges,4))  
  EndIf
  
  If lagerungsdichte<0
    MessageRequester("Fehler", "positive Lagerungsdichte angeben", #PB_MessageRequester_Ok)
    lagerungsdichte=1
    SetGadgetText(#String_Lagerungsdichte,StrD(lagerungsdichte,4))  
  EndIf
  
  If kr<0
    MessageRequester("Fehler", "positiven Ratenparameter angeben", #PB_MessageRequester_Ok)
    kr=1
    SetGadgetText(#String_kr,StrD(kr,4))
  EndIf
  
  If IsWindow(2)
    If Val(GetGadgetText(#Spin_Iterationsraster))<3 And inversionmode=1
      MessageRequester("Fehler","Weniger als 3 Iterationsschritte ergeben keine Lsung")
      SetGadgetText(#Spin_Iterationsraster,Str(3))
    EndIf
    If Val(GetGadgetText(#Spin_Iterationstiefe))<1 And inversionmode=1
      MessageRequester("Fehler","Iterationstiefe>0 angeben")
      SetGadgetText(#Spin_Iterationstiefe,Str(1))
    EndIf
  EndIf
  
  If obspoint>maxx Or obspoint<minx+deltax
    obspoint=maxx
    SetGadgetText(#String_obspoint,StrD(obspoint,4))
  EndIf
  
  If Kd<0
    MessageRequester("Fehler", "Sorptionsaffinitt positiv angeben", #PB_MessageRequester_Ok)
    Kd=0.5
    SetGadgetText(#String_Kd,StrD(Kd,4))
  EndIf
  
  If freund_n<0
    MessageRequester("Fehler", "Freundlich Exponent positiv angeben", #PB_MessageRequester_Ok)
    freund_n=1
    SetGadgetText(#String_freund_n,StrD(freund_n,4))
  EndIf
  
EndProcedure

Procedure inversion_window()  ; Fenster zur Inversion
  
  OpenPreferences(maindirectory+language)
  window_pos=WindowX(0)+656
  If window_pos+200>DesktopWidth(0):window_pos-200:EndIf
  If OpenWindow(2,window_pos,WindowY(0), 350, 366, "Inversionseinstellungen",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_MinimizeGadget)
    OptionGadget(#Radio_singleinversion,10,3,80,20,"single param.")
    OptionGadget(#Radio_multipleinversion,90,3,90,20,"multiple param.")
    OptionGadget(#Radio_SAinversion,180,3,80,20,"sim. anneal.")
    OptionGadget(#Radio_sensitivity,260,3,70,20,"sens. anal.")
    SetGadgetState(#Radio_singleinversion-1+inversionmode,1)
    TextGadget(#Text_Inversionstiefe,190, 113, 100, 20,"max. Iterationen")
    SpinGadget(#Spin_Inversionstiefe,190, 130, 100, 20, 1, 2000,#PB_Spin_Numeric):SetGadgetState (#Spin_Inversionstiefe, 200):SetGadgetText(#Spin_Inversionstiefe,"200")
    
    ListIconGadget(#ListIcon_Parameters, 10, 33, 170, 270,"fit?",27,#PB_ListIcon_CheckBoxes|#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
    AddGadgetColumn(#ListIcon_Parameters, 1," Parameter", 159)
    AddGadgetItem(#ListIcon_Parameters, 0, Chr(10)+ReadPreferenceString("lang_Q","Q"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_diff_coeff","diffusion"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_dispersivity","dispersivity"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_mass_transfer","mass transfer"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_Kd","mass transfer")+" eq")
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_Kd","mass transfer")+" neq")
    If isotherme=1
      AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+"freundl. n eq")
      AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+"freundl. n neq")
    ElseIf isotherme=2
      AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+"max. S GG")
      AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+"max. S NGG")
    EndIf        
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_theta","theta"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_bulk_density","bulk density"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_anteil_eq","fraction of equilibrium sites"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_theta_immobile","fraction im. region"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_mass_transfer_immobile","mass transfer to im. region"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_decay","1st order decay"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_production","production"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_evaporation","evaporation"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_porosity","porosity"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_cementation","cementation"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_saturation","saturation"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_sat_exp","saturation exponent"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_tempcoeff","temperature coefficient"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_vol_dfz_in","dead volume influent"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_vol_dfz_ef","dead volume effluent"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+"cont. Q 1")
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+"cont. Q 2")
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+"cont. Q 3")
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+"cont. Q 4")
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_background","concentration at start"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_conc_vg","concentration in supply vessel"))
    AddGadgetItem(#ListIcon_Parameters, -1, Chr(10)+ReadPreferenceString("lang_vol_vg","volume of supply vessel")) 
    
    TextGadget(#Text_Parameter_Inv,10,33,100,20,"Parameter:") 
    ComboBoxGadget(#Combo_Parameter_Inv,10,50,100,20)
    TextGadget(#Text_Parameter_Inv2,10,73,100,20,"Parameter 2:") 
    ComboBoxGadget(#Combo_Parameter_Inv2,10,90,100,20)
    For i=0 To 1
    AddGadgetItem(#Combo_Parameter_Inv+i, 0, ReadPreferenceString("lang_Q","Q"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_diff_coeff","diffusion"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_dispersivity","dispersivity"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_mass_transfer","mass transfer"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_Kd","mass transfer")+" eq")
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_Kd","mass transfer")+" neq")
    If isotherme=1
      AddGadgetItem(#Combo_Parameter_Inv+i, -1, "freundl. n eq")
      AddGadgetItem(#Combo_Parameter_Inv+i, -1, "freundl. n neq")
    ElseIf isotherme=2
      AddGadgetItem(#Combo_Parameter_Inv+i, -1, "max. S GG")
      AddGadgetItem(#Combo_Parameter_Inv+i, -1, "max. S NGG")
    EndIf        
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_theta","theta"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_bulk_density","bulk density"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_anteil_eq","fraction of equilibrium sites"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_theta_immobile","fraction im. region"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_mass_transfer_immobile","mass transfer to im. region"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_decay","1st order decay"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_production","production"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_evaporation","evaporation"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_porosity","porosity"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_cementation","cementation"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_saturation","saturation"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_sat_exp","saturation exponent"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_tempcoeff","temperature coefficient"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_vol_dfz_in","dead volume influent"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_vol_dfz_ef","dead volume effluent"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, "cont. Q 1")
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, "cont. Q 2")
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, "cont. Q 3")
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, "cont. Q 4")
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_background","concentration at start"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_conc_vg","concentration in supply vessel"))
    AddGadgetItem(#Combo_Parameter_Inv+i, -1, ReadPreferenceString("lang_vol_vg","volume of supply vessel"))     
    Next i
    SetGadgetState(#Combo_Parameter_Inv,last_inversion_parameter)
    SetGadgetState(#Combo_Parameter_Inv2,last_inversion_parameter2)
    TextGadget(#Text_inversionsauswahl, 190, 33, 100, 20, "Inversion gegen:")
    ComboBoxGadget(#Combo_SelectInv, 190, 50, 100, 20)
    AddGadgetItem(#Combo_SelectInv, 0, "DBK")
    AddGadgetItem(#Combo_SelectInv, -1, "Totvolumen Influent")
    AddGadgetItem(#Combo_SelectInv, -1, "Totvolumen Effluent")
    AddGadgetItem(#Combo_SelectInv, -1, "VG")
    AddGadgetItem(#Combo_SelectInv, -1, "Fraktionen")
    AddGadgetItem(#Combo_SelectInv, -1, "Strom")
    AddGadgetItem(#Combo_SelectInv, -1, "Spannung")
    SetGadgetState(#Combo_SelectInv,last_inversion_curve)
    
    TextGadget(#Text_iterationsstart, 10, 113, 100, 20, "Anfang Suchbereich")
    TextGadget(#Text_iterationsende, 10, 153, 100, 20, "Ende Suchbereich")
    TextGadget(#Text_iterationsstart2, 10, 193, 120, 20, "Anfang Suchbereich 2")
    TextGadget(#Text_iterationsende2, 10, 233, 120, 20, "Ende Suchbereich 2")
    TextGadget(#Text_iterationstiefe, 10, 193, 100, 20, "Iterationstiefe")
    SpinGadget(#Spin_Iterationstiefe, 10, 210, 100, 20, 1, 2000,  #PB_Spin_Numeric): SetGadgetState (#Spin_Iterationstiefe, tiefe) ;: SetGadgetText(#Spin_Iterationstiefe, "5")
    TextGadget(#Text_iterationsraster, 10, 233, 120, 20, "Gre des Suchrasters")
    SpinGadget(#Spin_Iterationsraster, 10, 250, 100, 20, 3, 2000,  #PB_Spin_Numeric): SetGadgetState (#Spin_Iterationsraster, raster) ;: SetGadgetText(#Spin_Iterationsraster, "10")
    StringGadget(#String_iterationsstart, 10, 130, 100, 20, StrD(iterationsstart,9))
    StringGadget(#String_iterationsende, 10, 170, 100, 20, StrD(iterationsende,9))
    StringGadget(#String_iterationsstart2, 10, 210, 100, 20, StrD(iterationsstart2,9))
    StringGadget(#String_iterationsende2, 10, 250, 100, 20, StrD(iterationsende2,9))
    
    TextGadget(#Text_Norm, 190, 73, 120, 20, "norm")
    TextGadget(#Text_temperature_factor, 190, 163, 120, 20, ReadPreferenceString("lang_temperature_factor","temperature factor"))
    TextGadget(#Text_cooling_speed, 190, 203, 140, 20, ReadPreferenceString("lang_cooling_speed","cooling speed"))
    TextGadget(#Text_equil_time, 190, 243, 140, 20, ReadPreferenceString("lang_equil_time","equilibration time"))
    StringGadget(#String_norm, 190, 90, 100, 20, StrD(norm,3))
    StringGadget(#String_temperature_factor, 190, 180, 100, 20, StrD(temperature_factor,9))
    StringGadget(#String_cooling_speed, 190, 220, 100, 20, StrD(cooling_speed,9))
    StringGadget(#String_equil_time, 190, 260, 100, 20, Str(equil_time))
       
    ButtonGadget(#Button_StartInv, 10, 310, 100, 20, "Start")
    ButtonGadget(#Button_CloseWin, 230, 340, 100, 20, "Close Window")
    ButtonGadget(#Button_reichtso, 230, 310, 100, 20, "genau genug")
    HideGadget(#Button_reichtso,1)
    ButtonGadget(#Button_Display_RMSE, 10, 340, 100, 20, "Display norm")
    ButtonGadget(#Button_ExportSSQ, 120, 340, 100, 20, "Export norm")
    ButtonGadget(#Button_Export_statistics, 120, 310, 100, 20, "Export Statistics")
    
    TextGadget(#Text_Steps1,190, 113, 100, 20,"Steps 1")
    SpinGadget(#Spin_Steps1,190, 130, 100, 20, 1, 2000,#PB_Spin_Numeric):SetGadgetState(#Spin_Steps1,steps1):SetGadgetText(#Spin_Steps1,Str(steps1))
    TextGadget(#Text_Steps2,190, 153, 100, 20,"Steps 2")
    SpinGadget(#Spin_Steps2,190, 170, 100, 20, 1, 2000,#PB_Spin_Numeric):SetGadgetState(#Spin_Steps2,steps2):SetGadgetText(#Spin_Steps2,Str(steps2))
    CheckBoxGadget(#CheckBox_useforwardprediction,130,200,200,20,"use Parameter 1 for forward prediction")
    SetGadgetState(#CheckBox_useforwardprediction,use_for_forward_prediction)
    CheckBoxGadget(#CheckBox_noise_on_forwardprediction,130,220,165,20,"add noise to forward prediction")
    SetGadgetState(#CheckBox_noise_on_forwardprediction,addnoise_to_forwardprediction)
    CheckBoxGadget(#CheckBox_inv_logsteps1,130,250,125,20,"Parameter 1 log. steps")
    SetGadgetState(#CheckBox_inv_logsteps1,inv_log1)
    CheckBoxGadget(#CheckBox_inv_logsteps2,130,270,125,20,"Parameter 2 log. steps")
    SetGadgetState(#CheckBox_inv_logsteps2,inv_log2)
    
  EndIf
  ClosePreferences() 
  If lehre
    SetGadgetState(#Radio_multipleinversion,1)
    HideGadget(#Radio_singleinversion,1)
    HideGadget(#Radio_SAinversion,1)
    HideGadget(#Radio_sensitivity,1)    
  EndIf 
  
EndProcedure

Procedure display_rmse()
  
  scalex_local.d
  scaley_local.d
  middle_local.d
  
  min.d=hugenumber
  max.d=0
  For i=1 To anzahl_rmsewerte
    If rmsewerte(i)\y>max:max=rmsewerte(i)\y:EndIf
    If rmsewerte(i)\y<min:min=rmsewerte(i)\y:EndIf
  Next i
  If max=min:max+1:EndIf
  scalex_local=560/(rmsewerte(0)\y-rmsewerte(0)\x)
  scaley_local=400/(max-min)
  middle_local=(max+min)/2
  
  For i=1 To anzahl_rmsewerte
    draw_rmsewerte(i)\x=Round((rmsewerte(i)\x-rmsewerte(0)\x)*scalex_local,#PB_Round_Nearest)
    draw_rmsewerte(i)\y=Round((rmsewerte(i)\y-middle_local)*scaley_local,#PB_Round_Nearest)
  Next i
  
  StartDrawing(ScreenOutput())  
  
  DrawingMode(#PB_2DDrawing_Default)
  
  BackColor(RGB(255,255,255))
  FrontColor(RGB(0,0,0))
  
  point=1
  For i=1 To anzahl_rmsewerte
    If draw_rmsewerte(i)\x<561 And draw_rmsewerte(i)\x>=0
      Circle(draw_rmsewerte(i)\x+40,240-draw_rmsewerte(i)\y,2,RGB(0,0,0))
    EndIf
  Next i
  
  StopDrawing()
  FlipBuffers()
  
  MessageRequester("","so siehts aus"+Chr(13)+"x: "+StrD(rmsewerte(0)\x,3)+"-"+StrD(rmsewerte(0)\y,3)+Chr(13)+"y: "+StrD(min,3)+"-"+StrD(max,3))
  
EndProcedure

Procedure.b check_overwrite(filename.s)  ;gibts den Dateinamen schon?
  
  ok.b
  ok=0
  If ReadFile(0,filename)
    CloseFile(0)
    If MessageRequester("Warning","Overwrite "+GetFilePart(filename)+" ?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes  
      If CreateFile(0,filename)
        ok=1
      Else  
        MessageRequester("Error","Could not open file") 
      EndIf  
    Else
      MessageRequester("Warning","Saving aborted")
    EndIf
  ElseIf filename 
    If CreateFile(0,filename)
      ok=1
    Else  
      MessageRequester("Error","Could not create file")
    EndIf  
  EndIf
  
  ProcedureReturn ok
  
EndProcedure

Procedure export_statistic()
  
  temp.s
  temp=SaveFileRequester("Select File",directory+"ExportStatistics","Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*",0)
  If temp
    directory=GetPathPart(temp)
    SetWindowTitle(0,"Parameter | "+directory)
  EndIf
  
  If SelectedFilePattern()=0 And Not GetExtensionPart(temp)="txt"
    temp+".txt"    
  EndIf
  
  If check_overwrite(temp)
    WriteStringN(0,export_statistics)
    CloseFile(0)
  EndIf  
  
EndProcedure   

Procedure export_SSQ()
  
  temp.s
  temp=SaveFileRequester("Select File",directory+"norm","Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*",0)
  If temp 
    directory=GetPathPart(temp)
    SetWindowTitle(0,"Parameter | "+directory)
  EndIf
  
  If SelectedFilePattern()=0 And Not GetExtensionPart(temp)="txt"
    temp+".txt"    
  EndIf
    
  If check_overwrite(temp)
    temp=""
    For i=1 To anzahl_rmsewerte
      temp+StrD(rmsewerte(i)\x)+Chr(9)+StrD(rmsewerte(i)\y)+#eol
    Next i  
    WriteStringN(0,temp)
    CloseFile(0)
  EndIf
  
EndProcedure  

Procedure open_window_sens()
  
  OpenPreferences(maindirectory+language)
  window_pos=WindowX(0)+656
  If window_pos+200>DesktopWidth(0):window_pos-200:EndIf
  If OpenWindow(3,window_pos,WindowY(0), 350, 366, "Sesitivittsanalyse",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_MinimizeGadget)

    TextGadget(#Text_sens_steps,190, 113, 100, 20,"Steps")
    SpinGadget(#Spin_sens_steps,190, 130, 100, 20, 1, 2000,#PB_Spin_Numeric)
    SetGadgetState(#Spin_sens_steps,sens_steps):SetGadgetText(#Spin_sens_steps,Str(sens_steps))
    
    TextGadget(#Text_sens_parameter,10,73,100,20,"Parameter:") 
    ComboBoxGadget(#Combo_sens_parameter,10,90,100,20)
    AddGadgetItem(#Combo_sens_parameter, 0, ReadPreferenceString("lang_Q","Q"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_diff_coeff","diffusion"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_dispersivity","dispersivity"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_mass_transfer","mass transfer"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_Kd","mass transfer")+" eq")
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_Kd","mass transfer")+" neq")
    If isotherme=1
      AddGadgetItem(#Combo_sens_parameter, -1, "freundl. n eq")
      AddGadgetItem(#Combo_sens_parameter, -1, "freundl. n neq")
    ElseIf isotherme=2
      AddGadgetItem(#Combo_sens_parameter, -1, "max. S GG")
      AddGadgetItem(#Combo_sens_parameter, -1, "max. S NGG")
    EndIf        
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_theta","theta"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_bulk_density","bulk density"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_anteil_eq","fraction of equilibrium sites"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_theta_immobile","fraction im. region"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_mass_transfer_immobile","mass transfer to im. region"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_decay","1st order decay"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_production","production"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_evaporation","evaporation"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_porosity","porosity"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_cementation","cementation"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_saturation","saturation"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_sat_exp","saturation exponent"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_tempcoeff","temperature coefficient"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_vol_dfz_in","dead volume influent"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_vol_dfz_ef","dead volume effluent"))
    AddGadgetItem(#Combo_sens_parameter, -1, "cont. Q 1")
    AddGadgetItem(#Combo_sens_parameter, -1, "cont. Q 2")
    AddGadgetItem(#Combo_sens_parameter, -1, "cont. Q 3")
    AddGadgetItem(#Combo_sens_parameter, -1, "cont. Q 4")
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_background","concentration at start"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_conc_vg","concentration in supply vessel"))
    AddGadgetItem(#Combo_sens_parameter, -1, ReadPreferenceString("lang_vol_vg","volume of supply vessel"))     

    SetGadgetState(#Combo_sens_parameter,last_inversion_parameter_sens)

    TextGadget(#Text_sens_selectbtc, 190, 33, 100, 20, "Kurve:")
    ComboBoxGadget(#Combo_sens_selectbtc, 190, 50, 100, 20)
    AddGadgetItem(#Combo_sens_selectbtc, 0, "DBK")
    AddGadgetItem(#Combo_sens_selectbtc, -1, "Totvolumen Influent")
    AddGadgetItem(#Combo_sens_selectbtc, -1, "Totvolumen Effluent")
    AddGadgetItem(#Combo_sens_selectbtc, -1, "VG")
    AddGadgetItem(#Combo_sens_selectbtc, -1, "Fraktionen")
    AddGadgetItem(#Combo_sens_selectbtc, -1, "Strom")
    AddGadgetItem(#Combo_sens_selectbtc, -1, "Spannung")
    SetGadgetState(#Combo_sens_selectbtc,last_inversion_curve_sens)
    
    TextGadget(#Text_sens_min, 10, 113, 100, 20, "von")
    TextGadget(#Text_sens_max, 10, 153, 100, 20, "bis")

    StringGadget(#String_sens_min, 10, 130, 100, 20, StrD(batch_start,9))
    StringGadget(#String_sens_max, 10, 170, 100, 20, StrD(batch_end,9))
    CheckBoxGadget(#Checkbox_sens_logsteps,10,190,100,20,"log. scale")
    SetGadgetState(#Checkbox_sens_logsteps,sens_log)
    
    ButtonGadget(#Button_sens_Start, 10, 310, 100, 20, "Start")
   
  EndIf
  ClosePreferences() 
  
EndProcedure  

Procedure moments(Array kurve.d(1),Array results.d(1))
  
   zerom.d=0
  firstm.d=0
  For i=1 To n_dbk
    zerom+kurve(i)*dbk_deltat
    firstm+(i*dbk_deltat)*kurve(i)*dbk_deltat
  Next i
  firstn.d=firstm/zerom
  results(1)=zerom
  results(2)=firstn
  secondc.d
  thirdc.d
  fourthc.d
  For i=1 To n_dbk
    secondc+Pow((i*dbk_deltat-firstn),2)*kurve(i)*dbk_deltat
    thirdc+Pow((i*dbk_deltat-firstn),3)*kurve(i)*dbk_deltat
    fourthc+Pow((i*dbk_deltat-firstn),4)*kurve(i)*dbk_deltat
  Next i
  secondc/(zerom*firstn*firstn)
  thirdc/(zerom*firstn*firstn*firstn)
  fourthc/(zerom*firstn*firstn*firstn*firstn)
  results(3)=thirdc/Pow(secondc,1.5)
  results(4)=fourthc/(secondc*secondc)
  results(5)=secondc*length/2  
  
EndProcedure  

Procedure moments_points(Array kurve.xy(1),Array results.d(1),n.i)
  
  zerom.d=0
  firstm.d=0
  distance.d=0
  For i=1 To n
    ;distance+(kurve(i)\x-kurve(i-1)\x)
    zerom+kurve(i)\y*(kurve(i)\x-kurve(i-1)\x)
    firstm+kurve(i)\x*kurve(i)\y*(kurve(i)\x-kurve(i-1)\x)
  Next i
  ;distance+(kurve(n)\x-kurve(n-1)\x)
  ;zerom+kurve(n)\y*(kurve(n)\x-kurve(n-1)\x)
  ;firstm+(distance)*kurve(n)\y*(kurve(n)\x-kurve(n-1)\x)
  firstn.d=firstm/zerom
  results(1)=zerom
  results(2)=firstn
  secondc.d
  thirdc.d
  fourthc.d
  distance=0
  For i=1 To n
    ;distance+(kurve(i)\x-kurve(i-1)\x)
    secondc+Pow((kurve(i)\x-firstn),2)*kurve(i)\y*(kurve(i)\x-kurve(i-1)\x)
    thirdc+Pow((kurve(i)\x-firstn),3)*kurve(i)\y*(kurve(i)\x-kurve(i-1)\x)
    fourthc+Pow((kurve(i)\x-firstn),4)*kurve(i)\y*(kurve(i)\x-kurve(i-1)\x)
  Next i
  ;distance+(kurve(n)\x-kurve(n-1)\x)
  ;secondc+Pow((distance-firstn),2)*kurve(n)\y*(kurve(n)\x-kurve(n-1)\x)
  ;thirdc+Pow((distance-firstn),3)*kurve(n)\y*(kurve(n)\x-kurve(n-1)\x)
  ;fourthc+Pow((distance-firstn),4)*kurve(n)\y*(kurve(n)\x-kurve(n-1)\x)
  secondc/(zerom*firstn*firstn)
  thirdc/(zerom*firstn*firstn*firstn)
  fourthc/(zerom*firstn*firstn*firstn*firstn)
  results(3)=thirdc/Pow(secondc,1.5)
  results(4)=fourthc/(secondc*secondc)
  results(5)=secondc*length/2  
  
EndProcedure  

Procedure clear_fi()
  
  For i=#String_flussunterbrechung_s1 To #String_flussunterbrechung_s10
    SetGadgetText(i,"-1")
  Next i
  
  For i=#String_flussunterbrechung_e1 To #String_flussunterbrechung_e10
    SetGadgetText(i,"-1")
  Next i
  
  For i=#String_weiterQ1 To #String_weiterQ10
    SetGadgetText(i,"0")
  Next i
  
  For i=#String_weiterc1 To #String_weiterc10
    SetGadgetText(i,"0")
  Next i
  
  For i=#String_weiterf1 To #String_weiterf10
    SetGadgetText(i,"0")
  Next i
  
  For i=#String_weitervol1 To #String_weitervol10
    SetGadgetText(i,"0")
  Next i  
  
EndProcedure  

Procedure.d calculate_moments(silent.i=0)
  
  Dim dfzindt.d(n_dbk)
  Dim dfzefdt.d(n_dbk)
  Dim dbkdt.d(n_dbk)
  Dim stromdt.d(n_dbk)
  Dim fraktdt.xy(n_frakt)
  Dim importdt.xy(n_imp)
  
  For i=1 To n_dbk-1  ;Berechung der Ableitungen
    dbkdt(i)=(dbk_implicit(i+1)-dbk_implicit(i))/(dbk_deltat)
    dfzindt(i)=(dbk_dfz_in(i+1)-dbk_dfz_in(i))/(dbk_deltat)
    dfzefdt(i)=(dbk_dfz_ef(i+1)-dbk_dfz_ef(i))/(dbk_deltat)
    stromdt(i)=(strom(i+1)-strom(i))/(dbk_deltat)
  Next i
  For i=1 To n_frakt-1
    fraktdt(i)\x=fraktionen(i)\x
    fraktdt(i)\y=(fraktionen(i+1)\y-fraktionen(i)\y)/(fraktionen(i+1)\x-fraktionen(i)\x)
  Next i
  For i=1 To n_imp-1
    importdt(i)\x=import_xy(i)\x
    importdt(i)\y=(import_xy(i+1)\y-import_xy(i)\y)/(import_xy(i+1)\x-import_xy(i)\x)
  Next i 
  
  If dataimported
    importdt(0)\x=import_xy(0)\x
    importdt(0)\y=(import_xy(1)\y-import_xy(0)\y)/(import_xy(1)\x-import_xy(0)\x)  
    importdt(n_imp)\x=import_xy(n_imp)\x
    importdt(n_imp)\y=(import_xy(n_imp)\y-import_xy(n_imp-1)\y)/(import_xy(n_imp)\x-import_xy(n_imp-1)\x)
  EndIf
  fraktdt(0)\x=fraktionen(0)\x
  fraktdt(0)\y=(fraktionen(1)\y-fraktionen(0)\y)/(fraktionen(1)\x-fraktionen(0)\x)
  fraktdt(n_frakt)\x=fraktionen(n_frakt)\x  
  fraktdt(n_frakt)\y=(fraktionen(n_frakt)\y-fraktionen(n_frakt-1)\y)/(fraktionen(n_frakt)\x-fraktionen(n_frakt-1)\x)  
  dbkdt(0)=(dbk_implicit(1)-dbk_implicit(0))/dbk_deltat
  dbkdt(n_dbk)=(dbk_implicit(n_dbk)-dbk_implicit(n_dbk-1))/dbk_deltat  
  dfzindt(0)=(dbk_dfz_in(1)-dbk_dfz_in(2))/dbk_deltat
  dfzindt(n_dbk)=(dbk_dfz_in(n_dbk)-dbk_dfz_in(n_dbk-1))/dbk_deltat  
  dfzefdt(0)=(dbk_dfz_ef(1)-dbk_dfz_ef(0))/dbk_deltat
  dfzefdt(n_dbk)=(dbk_dfz_ef(n_dbk)-dbk_dfz_ef(n_dbk-1))/dbk_deltat  
  stromdt(0)=(strom(1)-strom(0))/dbk_deltat
  stromdt(n_dbk)=(strom(n_dbk)-strom(n_dbk-1))/dbk_deltat
  
  Dim results.d(5) ; array mit ergebnissen 1:mass 2:avg arrival 3:skewness 4:kurtosis 5:app. disp
If Not silent
  If drawdbk
    moments(dbk_implicit(),results())
    MessageRequester("moments dbk dirac","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"apparent disp: "+StrD(results(5)))
    moments(dbkdt(),results())
    MessageRequester("moments dbk continuous","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"apparent disp: "+StrD(results(5)))
  EndIf
  
  If drawdfz_in
    moments(dbk_dfz_in(),results())
    MessageRequester("moments dbk_in dirac","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"apparent disp: "+StrD(results(5)))
    moments(dfzindt(),results())
    MessageRequester("moments dbk_in continuous","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"apparent disp: "+StrD(results(5)))
  EndIf
  
  If drawdfz_ef
    moments(dbk_dfz_ef(),results())
    MessageRequester("moments dbk_ef dirac","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"apparent disp: "+StrD(results(5)))
    moments(dfzefdt(),results())
    MessageRequester("moments dbk_ef continuous","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"apparent disp: "+StrD(results(5)))
  EndIf  
  
  If drawstrom
    moments(strom(),results())
    MessageRequester("moments strom dirac","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"apparent disp: "+StrD(results(5)))
    moments(stromdt(),results())
    MessageRequester("moments strom continuous","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"apparent disp: "+StrD(results(5)))
  EndIf
  
  If drawfrakt
    moments_points(fraktionen(),results(),n_frakt)
    MessageRequester("moments fractions dirac","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"apparent disp: "+StrD(results(5)))
    moments_points(fraktdt(),results(),n_frakt)
    MessageRequester("moments fractions continuous","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"apparent disp: "+StrD(results(5)))
  EndIf  
  
  If drawimport And dataimported
    moments_points(import_xy(),results(),n_imp)
    results(5)/length
    MessageRequester("moments import dirac","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"dispersion factor: "+StrD(results(5))+" (multiply by travel distance to get dispersivity)")
    moments_points(importdt(),results(),n_imp)
    results(5)/length
    MessageRequester("moments import continuous","sum of eflluent mass: "+StrD(results(1))+#eol+"average arrival time: "+StrD(results(2))+#eol+"skewness: "+StrD(results(3))+#eol+"kurtosis: "+StrD(results(4))+#eol+"dispersion factor: "+StrD(results(5))+" (multiply by travel distance to get dispersivity)")
  EndIf 
Else
  moments(dbkdt(),results())
  ProcedureReturn results(2)
EndIf  
EndProcedure  

Procedure draw_nothing()
  drawS=0
  SetGadgetState(#CheckBox_drawS,drawS)
  drawSeq=0
  SetGadgetState(#CheckBox_drawSeq,drawSeq)
  drawconc=0
  SetGadgetState(#CheckBox_drawconc,drawconc)
  drawvg=0
  SetGadgetState(#CheckBox_drawvg,drawvg)
  drawdbk=0
  SetGadgetState(#CheckBox_drawDBK,drawdbk)
  drawdfz_in=0
  SetGadgetState(#CheckBox_drawdfz_in,drawdfz_in)
  drawdfz_ef=0
  SetGadgetState(#CheckBox_drawdfz_ef,drawdfz_ef)
  drawfrakt=0
  SetGadgetState(#CheckBox_drawfrakt,drawfrakt)
  drawstrom=0
  SetGadgetState(#CheckBox_drawstrom,drawstrom)
  drawspannung=0
  SetGadgetState(#CheckBox_drawspannung,drawspannung)
EndProcedure 

Procedure check_buttons()  ; berprfung, welcher Button bettigt wurde
  
  temp.s
  
  If EventGadget()=#Button_Display_RMSE And EventType()=#PB_EventType_LeftClick  
    display_rmse()
  EndIf
  
  If EventGadget()=#Button_FittingCriteria And EventType()=#PB_EventType_LeftClick  
    If init_sucess
      If dataimported          
        ;draw_nothing()  
        Select selected_curve_for_FFT
          Case 0
            drawdbk=1
            SetGadgetState(#CheckBox_drawDBK,drawdbk)
            fitting_criteria(dbk_implicit())
          Case 1
            drawvg=1
            SetGadgetState(#CheckBox_drawvg,drawvg)
            fitting_criteria(dbk_implicit_vg()) 
          Case 2
            
          Case 3
            drawdfz_in=1
            SetGadgetState(#CheckBox_drawdfz_in,drawdfz_in)
            fitting_criteria(dbk_dfz_in()) 
          Case 4
            drawdfz_ef=1
            SetGadgetState(#CheckBox_drawdfz_ef,drawdfz_ef)  
            fitting_criteria(dbk_dfz_ef()) 
        EndSelect
      Else
        MessageRequester("Error","Zieldaten importieren!")
      EndIf
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")
    EndIf
  EndIf
  
  If EventGadget()=#Button_FFT And EventType()=#PB_EventType_LeftClick  
  Select selected_curve_for_FFT
    Case 0
      FFT(dbk_implicit(),n_dbk) 
    Case 1
      FFT(dbk_implicit_vg(),n_dbk) 
    Case 2
       
    Case 3
      FFT(dbk_dfz_in(),n_dbk) 
    Case 4
      FFT(dbk_dfz_ef(),n_dbk) 
  EndSelect 
  EndIf
  
  If EventGadget()=#Button_Export_statistics And EventType()=#PB_EventType_LeftClick  ;
    export_statistic()
  EndIf
  
  If EventGadget()=#Button_ExportSSQ And EventType()=#PB_EventType_LeftClick  ;
    export_SSQ()
  EndIf
  
  If EventGadget()=#Button_clearFI And EventType()=#PB_EventType_LeftClick  ;
    clear_fi()
  EndIf
  
  If EventGadget()=#Button_Language And EventType()=#PB_EventType_LeftClick  ;change language
    set_language()
  EndIf
  
  If EventGadget()=#Button_Standard And EventType()=#PB_EventType_LeftClick  ;Standard
    If MessageRequester("Warning","Reset Parameters to initial state (as read from last parameters file)?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes
      startwerte()
    EndIf
  EndIf
  
  If EventGadget()=#Button_Hilfe And EventType()=#PB_EventType_LeftClick  ;Hilfe
    hilfe()
  EndIf
  
  If EventGadget()=#Button_ReadPar And EventType()=#PB_EventType_LeftClick  ;Read Parameters
    If read_parameters()
      startwerte()
    EndIf  
  EndIf  
  
  If EventGadget()=#Button_SavePar And EventType()=#PB_EventType_LeftClick  ;Save Parameters
    save_parameters()           
  EndIf
  
  If EventGadget()=#Button_ExportDBK And EventType()=#PB_EventType_LeftClick  ;Export DBK
    If init_sucess
      export_dbk()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")
    EndIf
  EndIf
  
  If EventGadget()=#Button_ExportCS And EventType()=#PB_EventType_LeftClick  ;Export conc
    If init_sucess
      export_conc()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")
    EndIf
  EndIf
  
  If EventGadget()=#Button_Zeige_Derivatives And EventType()=#PB_EventType_LeftClick  ;zeige Ableitungen  calculate_moments()
    If init_sucess
      show_extrema()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")
    EndIf
  EndIf
  
  If EventGadget()=#Button_Moments And EventType()=#PB_EventType_LeftClick  ;zeige zentr. Momente
    If init_sucess
      calculate_moments()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")
    EndIf
  EndIf
  
  If EventGadget()=#Button_Importisothermeq And EventType()=#PB_EventType_LeftClick  ;Import isotherme eq
    If init_sucess
      import_isothermeq()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")
    EndIf
  EndIf
  
  If EventGadget()=#Button_ImportDBK And EventType()=#PB_EventType_LeftClick  ;Import DBK
    If init_sucess
      import_dbk()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")  
    EndIf
  EndIf
  
  If EventGadget()=#Button_ImportC And EventType()=#PB_EventType_LeftClick  ;Import conc
    If init_sucess
      import_conc()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")  
    EndIf
  EndIf
  
  If EventGadget()=#Button_ImportS And EventType()=#PB_EventType_LeftClick  ;Import S
    If init_sucess
      import_S()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")  
    EndIf
  EndIf
  
  If EventGadget()=#Button_ImportSeq And EventType()=#PB_EventType_LeftClick  ;Import Seq
    If init_sucess
      import_Seq()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")  
    EndIf
  EndIf
  
  If EventGadget()=#Button_Importisotherm And EventType()=#PB_EventType_LeftClick  ;Import isotherme
    If init_sucess
      import_isotherm()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")  
    EndIf
  EndIf
  
  If EventGadget()=#Button_ImportLFKorrelation And EventType()=#PB_EventType_LeftClick  ;Import LF-Korrelation
    If init_sucess
      Import_lfkorrelation()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")  
    EndIf
  EndIf
  
  If EventGadget()=#Button_ImportTemp And EventType()=#PB_EventType_LeftClick  ;Import LF-Korrelation
    If init_sucess
      Import_temp()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")  
    EndIf
  EndIf
  
  If EventGadget()=#Button_Inversion And EventType()=#PB_EventType_LeftClick  ;Inversion / Ziel der ganzen Geschichte
    If init_sucess
      ;If dataimported
        If Not IsWindow(2):inversion_window():EndIf
        transfer_boxes_to_variable()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")
    EndIf
  EndIf
  
  If EventGadget()=#Button_sens_Windows And EventType()=#PB_EventType_LeftClick  ;Inversion / Ziel der ganzen Geschichte
    If init_sucess
      If Not IsWindow(3):open_window_sens():EndIf
      transfer_boxes_to_variable()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")
    EndIf  
  EndIf
  
  If EventGadget()=#Button_sens_Start And EventType()=#PB_EventType_LeftClick
    If sens_log And (batch_end=0 Or batch_start=0)
      MessageRequester("Error","0 can't be part of a log. scale")
    Else  
      batch_btcs()
    EndIf  
  EndIf
  
  If EventGadget()=#Button_StartInv And EventType()=#PB_EventType_LeftClick
    If inversionmode=4 And use_for_forward_prediction
      sensitivity()
    Else
      If dataimported
        If inversionmode=1
          inversion()
        ElseIf inversionmode=4
          sensitivity()
        Else 
          inversion_multi()
        EndIf 
      Else
      MessageRequester("Error","Zieldaten importieren!")
    EndIf
    EndIf
  EndIf
  
  If EventGadget()=#Button_Rescale And EventType()=#PB_EventType_LeftClick  ;Rescale
    If init_sucess
      bound_low=0
      bound_up=dbkmaxtime
      set_scale()
      convert_to_scale()
      draw_graph_as_line()
    Else
      MessageRequester("Error","Erst nach dem Starten des Programmes mglich")  
    EndIf
  EndIf
  
  If EventGadget()=#Button_FarbeC And EventType()=#PB_EventType_LeftClick
    farbec=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeS And EventType()=#PB_EventType_LeftClick
    farbes=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeSeq And EventType()=#PB_EventType_LeftClick
    farbeseq=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeDBK And EventType()=#PB_EventType_LeftClick
    farbedbk=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeDFZ_in And EventType()=#PB_EventType_LeftClick
    farbedfz_in=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeDFZ_ef And EventType()=#PB_EventType_LeftClick
    farbedfz_ef=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeVG And EventType()=#PB_EventType_LeftClick
    farbevg=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeImp And EventType()=#PB_EventType_LeftClick
    farbeimp=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeFrakt And EventType()=#PB_EventType_LeftClick
    farbefrakt=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeSpannung And EventType()=#PB_EventType_LeftClick
    farbespannung=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeStrom And EventType()=#PB_EventType_LeftClick
    farbestrom=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_FarbeBac And EventType()=#PB_EventType_LeftClick
    farbebac=ColorRequester()
    set_colors()
  EndIf
  
  If EventGadget()=#Button_CloseWin And EventType()=#PB_EventType_LeftClick
    CloseWindow(2)
  EndIf  
  
EndProcedure

Procedure Open_Window_0()   ;Parametermen
  
  If OpenWindow(0, xpos, ypos, 650, 366, "Parameter | "+directory,  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_MinimizeGadget)
    PanelGadget(#Panel_Parameter,10,10,620,300)
    AddGadgetItem (#Panel_Parameter, -1, "")
    TextGadget(#Text_haltezeit, 200, 23, 80, 20, "")
    TextGadget(#Text_obspoint, 200, 63, 100, 20, "")
    TextGadget(#Text_sigma, 200, 93, 100, 20, "Sigma")
    StringGadget(#String_sigma, 300, 90, 80, 20, StrD(sigma,3))
    StringGadget(#String_haltezeit, 250, 20, 80, 20, StrD(haltezeit,4))
    StringGadget(#String_obspoint, 300, 60, 80, 20, StrD(obspoint,3))
    CheckBoxGadget(#CheckBox_kreislauf, 10, 10, 120, 20, ""): SetGadgetState(#CheckBox_kreislauf,kreislauf)
    CheckBoxGadget(#CheckBox_recordDBK, 10, 30, 120, 20, ""): SetGadgetState(#CheckBox_recordDBK,recorddbk)
    OptionGadget(#Radio_resident_conc,10, 50, 90, 20, "resident conc."):OptionGadget(#Radio_flux_conc,110, 50, 50, 20, "flux c."):SetGadgetState(#Radio_resident_conc+flux_conc,1)
    CheckBoxGadget(#CheckBox_drawflussunterbrechung, 10, 70, 180, 20, ""): SetGadgetState(#CheckBox_drawflussunterbrechung,drawflussunterbrechung)
    CheckBoxGadget(#CheckBox_usefittedisotherm, 10, 90, 180, 20, ""): SetGadgetState(#CheckBox_usefittedisotherm,usefittedisotherm)
    CheckBoxGadget(#CheckBox_usefittedisothermeq, 10, 110, 175, 20, ""): SetGadgetState(#CheckBox_usefittedisothermeq,usefittedisothermeq)
    CheckBoxGadget(#CheckBox_usefittedlf, 10, 150, 175, 20, ""): SetGadgetState(#CheckBox_usefittedlf,usefittedlf)
    CheckBoxGadget(#CheckBox_converttolf, 10, 130, 175, 20, ""): SetGadgetState(#CheckBox_converttolf,converttolf)
    CheckBoxGadget(#CheckBox_implicit_euler, 10, 170, 175, 20, "Implicit Euler Scheme"): SetGadgetState(#CheckBox_implicit_euler,implicit)
    OptionGadget(#Radio_bezogen_auf_time, 340, 11, 140, 20, ""):SetGadgetState(#Radio_bezogen_auf_time, 1)
    OptionGadget(#Radio_bezogen_auf_dbktime, 340, 29, 140, 30, "")
    CheckBoxGadget(#CheckBox_addnoise, 10, 190, 175, 20, "add noise (heteroscedastic)")
    
    AddGadgetItem (#Panel_Parameter, -1, "")
    TextGadget(#Text_deltax, 10, 13, 100, 20, "")
    TextGadget(#Text_deltat, 10, 33, 100, 20, "")
    TextGadget(#Text_minx, 10, 53, 100, 20, "")
    TextGadget(#Text_maxx, 10, 73, 100, 20, "")
    TextGadget(#Text_dbkmaxtime, 10, 93, 100, 20, "")
    TextGadget(#Text_dbk_deltat, 10, 113, 100, 20, "")
    TextGadget(#Text_Fraktionsdauer, 10, 133, 90, 20, "")
    StringGadget(#String_deltax, 120, 10, 80, 20, StrD(deltax,4))
    StringGadget(#String_deltat, 120, 30, 80, 20, StrD(deltat,4))
    StringGadget(#String_minx, 120, 50, 80, 20, StrD(minx,4))
    StringGadget(#String_maxx, 120, 70, 80, 20, StrD(maxx,4))
    StringGadget(#String_dbkmaxtime, 120, 90, 80, 20, StrD(dbkmaxtime,4))
    StringGadget(#String_dbk_deltat, 120, 110, 80, 20, StrD(dbk_deltat,4))
    StringGadget(#String_Fraktionsdauer, 120, 130, 80, 20, StrD(frakt_deltat,4))
    
    AddGadgetItem (#Panel_Parameter, -1, "")  
    TextGadget(#Text_Grundflaeche, 10, 13, 180, 20, "")
    TextGadget(#Text_Q, 10, 33, 180, 20, "")
    TextGadget(#Text_Diff, 10, 53, 180, 20, "")      
    TextGadget(#Text_dispersivity, 10, 73, 180, 20, "")
    TextGadget(#Text_Wassergehalt, 10, 93, 180, 20, "")
    TextGadget(#Text_conc_vg, 10, 113, 180, 20, "")
    TextGadget(#Text_vol_vg, 10, 133, 180, 20, "")
    TextGadget(#Text_background, 10, 153, 180, 20, "")
    TextGadget(#Text_vol_dfz_in, 10, 183, 180, 20, "")
    TextGadget(#Text_conc_DFZ_in, 10, 203, 180, 20, "")
    TextGadget(#Text_vol_dfz_ef, 300, 183, 180, 20, "")
    TextGadget(#Text_conc_DFZ_ef, 300, 203, 180, 20, "")
    StringGadget(#String_Grundflaeche, 200, 10, 80, 20, StrD(grundflaeche,4))
    StringGadget(#String_Q, 200, 30, 80, 20, StrD(v,4))
    StringGadget(#String_Diff, 200, 50, 80, 20, StrD(Diff,7))
    StringGadget(#String_dispersivity, 200, 70, 80, 20, StrD(dispersivity,4))
    StringGadget(#String_theta, 200, 90, 80, 20, StrD(theta_ges,4))
    StringGadget(#String_conc_vg, 200, 110, 80, 20, StrD(conc_vg_init,7))
    StringGadget(#String_vol_vg, 200, 130, 80, 20, StrD(vol_vg,4))
    StringGadget(#String_background, 200, 150, 80, 20, StrD(background,4))
    StringGadget(#String_vol_dfz_in, 200, 180, 80, 20, StrD(vol_dfz_in,4))
    StringGadget(#String_conc_dfz_in, 200, 200, 80, 20, StrD(conc_dfz_in,4))
    StringGadget(#String_vol_dfz_ef, 490, 180, 80, 20, StrD(vol_dfz_ef,4))
    StringGadget(#String_conc_dfz_ef, 490, 200, 80, 20, StrD(conc_dfz_ef,4))
    TextGadget(#Text_theta_immobile, 300, 13, 180, 20, "")
    TextGadget(#Text_massentransfer_immobile, 300, 33, 180, 20, "")
    StringGadget(#String_theta_immobile, 490, 10, 80, 20, StrD(theta_im,7))
    StringGadget(#String_massentransfer_immobile, 490, 30, 80, 20, StrD(mass_trans_im,7))
    
    AddGadgetItem (#Panel_Parameter, -1, "")
    CheckBoxGadget(#CheckBox_usesorption, 10, 10, 145, 20, ""): SetGadgetState(#CheckBox_usesorption,usesorption)
    OptionGadget(#Radio_Isotherme_freund, 260, 10, 120, 20, "")
    OptionGadget(#Radio_Isotherme_langmuir, 400, 10, 120, 20, "")
    TextGadget(#Text_Lagerungsdichte, 10, 33, 140, 20, "")
    TextGadget(#Text_verteilung, 10, 53, 140, 20, "")
    FrameGadget(#Frame_NGG_main, 5, 75, 240, 80, "")
    TextGadget(#Text_sorptionsrate, 10, 93, 140, 20, "")
    TextGadget(#Text_Kd, 10, 113, 140, 20, "Kd")
    TextGadget(#Text_freund_n, 10, 133, 140, 20, "")
    FrameGadget(#Frame_GG_main, 5, 155, 240, 60, "")
    TextGadget(#Text_Kd_eq, 10, 173, 140, 20, "Kd")
    TextGadget(#Text_freund_n_eq, 10, 193, 140, 20, "")        
    StringGadget(#String_Lagerungsdichte, 160, 30, 80, 20, StrD(lagerungsdichte,4))
    StringGadget(#String_verteilung, 160, 50, 80, 20, StrD(verteilung,5))
    
    If isotherme=1
      SetGadgetText(#Text_freund_n,"n")
      SetGadgetText(#Text_freund_n_eq,"n")
    ElseIf isotherme=2
      SetGadgetText(#Text_freund_n,"S_max")
      SetGadgetText(#Text_freund_n_eq,"S_max")
    EndIf  
    
    StringGadget(#String_kr, 160, 90, 80, 20, StrD(kr,7))
    StringGadget(#String_Kd, 160, 110, 80, 20, StrD(Kd,4))
    StringGadget(#String_freund_n, 160, 130, 80, 20, StrD(freund_n,4))
    StringGadget(#String_Kd_eq, 160, 170, 80, 20, StrD(Kd_eq,4))
    StringGadget(#String_freund_n_eq, 160, 190, 80, 20, StrD(freund_n_eq,4))
    FrameGadget(#Frame_NGG, 260, 40, 260, 70, "")
    OptionGadget(#Radio_normalsorption, 280, 60, 220, 20, "")
    OptionGadget(#Radio_newton, 280, 80, 220, 20, "") 
    ;SetGadgetState(#Radio_normalsorption-1+sorptionmode,1)
    
    AddGadgetItem (#Panel_Parameter, -1, "") 
    TextGadget(#Text_Abbau_1, 10, 33, 150, 20, "")
    TextGadget(#Text_Wachstum_max, 10, 53, 150, 20, "")
    TextGadget(#Text_Substrataff, 10, 73, 150, 20, "")
    TextGadget(#Text_Bakterienzahl_init, 10, 93, 150, 20, "")
    TextGadget(#Text_Produktion, 10, 113, 150, 20, "")    
    TextGadget(#Text_Verdunstung, 10, 133, 150, 20, "")
    StringGadget(#String_Abbau_1, 170, 30, 80, 20, StrD(abbau_1,9))
    StringGadget(#String_Wachstum_max, 170, 50, 80, 20, StrD(wachstum_max,9),#PB_String_ReadOnly)
    StringGadget(#String_Substrataff, 170, 70, 80, 20, StrD(substrataff,9),#PB_String_ReadOnly)
    StringGadget(#String_Bakterienzahl_init, 170, 90, 80, 20, StrD(bakterienzahl_init,9),#PB_String_ReadOnly)
    StringGadget(#String_Produktion, 170, 110, 80, 20, StrD(produktion,9))
    StringGadget(#String_Verdunstung, 170, 130, 80, 20, StrD(verdunstung,9))
    
    AddGadgetItem (#Panel_Parameter, -1, "")  
    TextGadget(#Text_flussunterbrechung, 10, 10, 120, 20, "")
    TextGadget(#Text_flussunterbrechung_von, 10, 30, 50, 20, "")
    TextGadget(#Text_flussunterbrechung_bis, 70, 30, 50, 20, "")
    TextGadget(#Text_weiterv, 130, 30 ,60 ,20 , "")
    TextGadget(#Text_weiterc, 190, 30 ,60 ,20 , "")
    TextGadget(#Text_weiterf, 250, 30 ,60 ,20 , "")
    TextGadget(#Text_weitervol, 310, 30 ,60 ,20 , "")
    StringGadget(#String_flussunterbrechung_s1, 10, 50, 60, 20, StrD(flussU_s1))
    StringGadget(#String_flussunterbrechung_e1, 70, 50, 60, 20, StrD(flussU_e1))
    StringGadget(#String_flussunterbrechung_s2, 10, 70, 60, 20, StrD(flussU_s2))
    StringGadget(#String_flussunterbrechung_e2, 70, 70, 60, 20, StrD(flussU_e2))
    StringGadget(#String_flussunterbrechung_s3, 10, 90, 60, 20, StrD(flussU_s3))
    StringGadget(#String_flussunterbrechung_e3, 70, 90, 60, 20, StrD(flussU_e3))
    StringGadget(#String_flussunterbrechung_s4, 10, 110, 60, 20, StrD(flussU_s4))
    StringGadget(#String_flussunterbrechung_e4, 70, 110, 60, 20, StrD(flussU_e4))
    StringGadget(#String_flussunterbrechung_s5, 10, 130, 60, 20, StrD(flussU_s5))
    StringGadget(#String_flussunterbrechung_e5, 70, 130, 60, 20, StrD(flussU_e5))
    StringGadget(#String_flussunterbrechung_s6, 10, 150, 60, 20, StrD(flussU_s6))
    StringGadget(#String_flussunterbrechung_e6, 70, 150, 60, 20, StrD(flussU_e6))
    StringGadget(#String_flussunterbrechung_s7, 10, 170, 60, 20, StrD(flussU_s7))
    StringGadget(#String_flussunterbrechung_e7, 70, 170, 60, 20, StrD(flussU_e7))
    StringGadget(#String_flussunterbrechung_s8, 10, 190, 60, 20, StrD(flussU_s8))
    StringGadget(#String_flussunterbrechung_e8, 70, 190, 60, 20, StrD(flussU_e8))
    StringGadget(#String_flussunterbrechung_s9, 10, 210, 60, 20, StrD(flussU_s9))
    StringGadget(#String_flussunterbrechung_e9, 70, 210, 60, 20, StrD(flussU_e9))
    StringGadget(#String_flussunterbrechung_s10, 10, 230, 60, 20, StrD(flussU_s10))
    StringGadget(#String_flussunterbrechung_e10, 70, 230, 60, 20, StrD(flussU_e10))
    StringGadget(#String_weiterQ1, 130, 50, 60, 20, StrD(weiterQ1))
    StringGadget(#String_weiterQ2, 130, 70, 60, 20, StrD(weiterQ2))
    StringGadget(#String_weiterQ3, 130, 90, 60, 20, StrD(weiterQ3))
    StringGadget(#String_weiterQ4, 130, 110, 60, 20, StrD(weiterQ4))
    StringGadget(#String_weiterQ5, 130, 130, 60, 20, StrD(weiterQ5))
    StringGadget(#String_weiterQ6, 130, 150, 60, 20, StrD(weiterQ6))
    StringGadget(#String_weiterQ7, 130, 170, 60, 20, StrD(weiterQ7))
    StringGadget(#String_weiterQ8, 130, 190, 60, 20, StrD(weiterQ8))
    StringGadget(#String_weiterQ9, 130, 210, 60, 20, StrD(weiterQ9))
    StringGadget(#String_weiterQ10, 130, 230, 60, 20, StrD(weiterQ10))
    StringGadget(#String_weiterc1, 190, 50, 60, 20, StrD(weiterc1))
    StringGadget(#String_weiterc2, 190, 70, 60, 20, StrD(weiterc2))
    StringGadget(#String_weiterc3, 190, 90, 60, 20, StrD(weiterc3))
    StringGadget(#String_weiterc4, 190, 110, 60, 20, StrD(weiterc4))
    StringGadget(#String_weiterc5, 190, 130, 60, 20, StrD(weiterc5))
    StringGadget(#String_weiterc6, 190, 150, 60, 20, StrD(weiterc6))
    StringGadget(#String_weiterc7, 190, 170, 60, 20, StrD(weiterc7))
    StringGadget(#String_weiterc8, 190, 190, 60, 20, StrD(weiterc8))
    StringGadget(#String_weiterc9, 190, 210, 60, 20, StrD(weiterc9))
    StringGadget(#String_weiterc10, 190, 230, 60, 20, StrD(weiterc10))
    StringGadget(#String_weiterf1, 250, 50, 60, 20, StrD(weiterf1,2))
    StringGadget(#String_weiterf2, 250, 70, 60, 20, StrD(weiterf2,2))
    StringGadget(#String_weiterf3, 250, 90, 60, 20, StrD(weiterf3,2))
    StringGadget(#String_weiterf4, 250, 110, 60, 20, StrD(weiterf4,2))
    StringGadget(#String_weiterf5, 250, 130, 60, 20, StrD(weiterf5,2))
    StringGadget(#String_weiterf6, 250, 150, 60, 20, StrD(weiterf6,2))
    StringGadget(#String_weiterf7, 250, 170, 60, 20, StrD(weiterf7,2))
    StringGadget(#String_weiterf8, 250, 190, 60, 20, StrD(weiterf8,2))
    StringGadget(#String_weiterf9, 250, 210, 60, 20, StrD(weiterf9,2))
    StringGadget(#String_weiterf10, 250, 230, 60, 20, StrD(weiterf10,2))
    StringGadget(#String_weitervol1, 310, 50, 60, 20, StrD(weitervol1,2))
    StringGadget(#String_weitervol2, 310, 70, 60, 20, StrD(weitervol2,2))
    StringGadget(#String_weitervol3, 310, 90, 60, 20, StrD(weitervol3,2))
    StringGadget(#String_weitervol4, 310, 110, 60, 20, StrD(weitervol4,2))
    StringGadget(#String_weitervol5, 310, 130, 60, 20, StrD(weitervol5,2))
    StringGadget(#String_weitervol6, 310, 150, 60, 20, StrD(weitervol6,2))
    StringGadget(#String_weitervol7, 310, 170, 60, 20, StrD(weitervol7,2))
    StringGadget(#String_weitervol8, 310, 190, 60, 20, StrD(weitervol8,2))
    StringGadget(#String_weitervol9, 310, 210, 60, 20, StrD(weitervol9,2))
    StringGadget(#String_weitervol10, 310, 230, 60, 20, StrD(weitervol10,2))
    ButtonGadget(#Button_clearFI, 370,50,80,20,"clear all")
    
    AddGadgetItem (#Panel_Parameter, -1, "")
    CheckBoxGadget(#CheckBox_usevoltage,10,10,130,20,"")
    TextGadget(#Text_Spannung, 10, 33, 130, 20, "")
    TextGadget(#Text_Abnahme1, 10, 53, 130, 20, "")
    TextGadget(#Text_Abnahme2, 10, 73, 130, 20, "")
    TextGadget(#Text_Porositaet, 10, 93, 130, 20, "")
    TextGadget(#Text_Zementierungsfaktor, 10, 113, 130, 20, "")
    TextGadget(#Text_Saettigung, 10, 133, 130, 20, "")
    TextGadget(#Text_Saettigungsexponent, 10, 153, 130, 20, "")
    TextGadget(#Text_LFKorrelationskoeffizient, 10, 173, 130, 20, "")
    TextGadget(#Text_temperaturkoeffizient, 10, 223, 130, 20, "")
    StringGadget(#String_Spannung, 150, 30, 80, 20, StrD(spannung_gesamt,4))
    StringGadget(#String_Abnahme1, 150, 50, 80, 20, StrD(spannungsabnahme1,4))
    StringGadget(#String_Abnahme2, 150, 70, 80, 20, StrD(spannungsabnahme2,4))
    StringGadget(#String_Porositaet, 150, 90, 80, 20, StrD(porositaet,4))
    StringGadget(#String_Zementierungsfaktor, 150, 110, 80, 20, StrD(zementierungsfaktor,4))
    StringGadget(#String_Saettigung, 150, 130, 80, 20, StrD(saettigung,4))
    StringGadget(#String_Saettigungsexponent, 150, 150, 80, 20, StrD(saettigungsexponent,4))
    StringGadget(#String_LFKorrelationskoeffizient, 150, 170, 80, 20, StrD(lfkorrelationskoeffizient,7))
    CheckBoxGadget(#CheckBox_usetemp, 10, 200, 160, 20, "")
    StringGadget(#String_temperaturkoeffizient, 150, 220, 80, 20, StrD(temperaturkoeffizient,4))
    
    AddGadgetItem (#Panel_Parameter, -1, "")
    CheckBoxGadget(#CheckBox_drawconc, 10, 10, 220, 20, ""): SetGadgetState(#CheckBox_drawconc,drawconc)
    CheckBoxGadget(#CheckBox_drawS, 10, 30, 220, 20, ""): SetGadgetState(#CheckBox_drawS,drawS)
    CheckBoxGadget(#CheckBox_drawSeq, 10, 50, 220, 20, ""): SetGadgetState(#CheckBox_drawSeq,drawSeq)
    CheckBoxGadget(#CheckBox_drawbac, 10, 70, 220, 20, ""): SetGadgetState(#CheckBox_drawbac,drawbac)
    CheckBoxGadget(#CheckBox_drawDBK, 10, 100, 190, 20, ""): SetGadgetState(#CheckBox_drawDBK,drawdbk)
    CheckBoxGadget(#CheckBox_drawvg, 10, 120, 190, 20, ""): SetGadgetState(#CheckBox_drawvg,drawvg)
    CheckBoxGadget(#CheckBox_drawimport, 10, 140, 190, 20, ""): SetGadgetState(#CheckBox_drawimport,drawimport)
    CheckBoxGadget(#CheckBox_drawdfz_in, 10, 160, 190, 20, ""): SetGadgetState(#CheckBox_drawDFZ_in,drawdfz_in)
    CheckBoxGadget(#CheckBox_drawdfz_ef, 10, 180, 190, 20, ""): SetGadgetState(#CheckBox_drawDFZ_ef,drawdfz_ef)
    CheckBoxGadget(#CheckBox_drawfrakt, 10, 200, 190, 20, ""): SetGadgetState(#CheckBox_drawfrakt,drawfrakt)
    CheckBoxGadget(#CheckBox_drawspannung, 10, 230, 190, 20, ""): SetGadgetState(#CheckBox_drawspannung,drawspannung)
    CheckBoxGadget(#CheckBox_drawstrom, 10, 250, 190, 20, ""): SetGadgetState(#CheckBox_drawstrom,drawstrom)
    CheckBoxGadget(#CheckBox_kleinePunkte,400,10,100,20,""): SetGadgetState(#CheckBox_kleinePunkte,kleinepunkte)
    CheckBoxGadget(#CheckBox_drawfft,400,30,100,20,"FFT"): SetGadgetState(#CheckBox_drawfft,drawfft)
  
    TextGadget(#Text_FarbeC, 250, 10, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_FarbeS, 250, 30, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_FarbeSeq, 250, 50, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_Farbebac, 250, 70, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_FarbeDBK, 250, 100, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_FarbeVG, 250, 120, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_FarbeImp, 250, 140, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_FarbeDFZ_in, 250, 160, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_FarbeDFZ_ef, 250, 180, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_FarbeFrakt, 250, 200, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_FarbeSpannung, 250, 230, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    TextGadget(#Text_FarbeStrom, 250, 250, 20, 20, "", #PB_Text_Center|#PB_Text_Border)
    ButtonGadget(#Button_FarbeC, 280,10,100,20, "")
    ButtonGadget(#Button_FarbeS, 280,30,100,20, "")
    ButtonGadget(#Button_FarbeSeq, 280,50,100,20, "")
    ButtonGadget(#Button_Farbebac, 280,70,100,20, "")
    ButtonGadget(#Button_FarbeDBK, 280,100,100,20, "")
    ButtonGadget(#Button_FarbeVG, 280,120,100,20, "")
    ButtonGadget(#Button_FarbeImp, 280,140,100,20, "")
    ButtonGadget(#Button_FarbeDFZ_in, 280,160,100,20, "")
    ButtonGadget(#Button_FarbeDFZ_ef, 280,180,100,20, "")
    ButtonGadget(#Button_FarbeFrakt, 280,200,100,20, "")
    ButtonGadget(#Button_FarbeSpannung, 280,230,100,20, "") 
    ButtonGadget(#Button_FarbeStrom, 280,250,100,20, "")
    
    AddGadgetItem(#Panel_Parameter, -1, "")
    TextGadget(#Text_Export,70,10,150,20,"Export")
    TextGadget(#Text_Import,260,10,150,20,"Import")
    ButtonGadget(#Button_ExportDBK, 10,30,150,20, "breakthrough...")
    ButtonGadget(#Button_ExportCS, 10,50,150,20, "concentration...")
    ButtonGadget(#Button_Zeige_Derivatives, 390,30,150,20, "Ableitungen") 
    ButtonGadget(#Button_Moments, 390,50,150,20, "zentr. Momente")
    ButtonGadget(#Button_FFT, 390,90,150,20, "FFT") 
    ButtonGadget(#Button_FittingCriteria,390,70,150,20,"Fitting Criteria")
    TextGadget(#Text_FFT, 390,113,150,20, "apply to:")
    ComboBoxGadget(#Combo_FFT, 390,130,150,20)
    AddGadgetItem(#Combo_FFT, -1, ReadPreferenceString("lang_draw_dbk","Durchbruchskurve"))
    AddGadgetItem(#Combo_FFT, -1, ReadPreferenceString("lang_draw_vg","Vorratsgef"))
    AddGadgetItem(#Combo_FFT, -1, ReadPreferenceString("lang_draw_import","Importierte Daten"))
    AddGadgetItem(#Combo_FFT, -1, ReadPreferenceString("lang_draw_dfz_in","Totvolumen Influent"))
    AddGadgetItem(#Combo_FFT, -1, ReadPreferenceString("lang_draw_dfz_ef","Totvolumen Effluent"))
    SetGadgetState(#Combo_FFT,selected_curve_for_FFT)
    
    ButtonGadget(#Button_ImportDBK, 200,30,150,20, "breakthrough...")
    ButtonGadget(#Button_ImportC, 200,50,150,20, "initial Conc...")
    ButtonGadget(#Button_ImportSeq, 200,70,150,20, "initial S eq...")
    ButtonGadget(#Button_ImportS, 200,90,150,20, "initial S neq...")        
    ButtonGadget(#Button_Importisothermeq, 200,120,150,20, "Isotherme eq...")
    ButtonGadget(#Button_Importisotherm, 200,140,150,20, "Isotherme neq...")
    ButtonGadget(#Button_ImportLFKorrelation, 200,160,150,20, "LF-Korrelation...")
    ButtonGadget(#Button_ImportTemp, 200, 190, 150, 20, "Temperaturgang")
    
    CloseGadgetList()  
    
    ButtonGadget(#Button_Start, 10, 320, 80, 20, "Start")
    ButtonGadget(#Button_Beenden, 10, 340, 80, 20, "Beenden")
    ButtonGadget(#Button_Standard, 100,320,100,20, "Reset Parameters")
    ButtonGadget(#Button_Hilfe, 100,340,100,20, "Hilfe")
    ButtonGadget(#Button_ReadPar, 200,320,100,20, "Read Parameters...")
    ButtonGadget(#Button_SavePar, 200,340,100,20, "Save Parameters...")
    ButtonGadget(#Button_Inversion, 320,320,100,20, "Inversion...")
    ButtonGadget(#Button_sens_Windows, 320,340,100,20, "Sensitivity...")
    ButtonGadget(#Button_Rescale, 440,320,80,20, "Rescale")
    ButtonGadget(#Button_Mouse, 440,340,80,20, "Use Mouse", #PB_Button_Toggle)
    ButtonGadget(#Button_Language, 540,330,100,20, "")
    set_colors()
    
    OpenWindowedScreen(WindowID(0),20,15,1,1,0,0,0)
    !fldcw [v_FPU_ControlWord]
    
    startwerte()
    set_language()
        
  If lehre=1
    HideGadget(#Button_FFT,1)
    HideGadget(#Combo_FFT,1)
    HideGadget(#text_FFT,1)
    HideGadget(#Button_ImportC,1)
    HideGadget(#Button_ImportSeq,1)
    HideGadget(#Button_ImportS,1)
    HideGadget(#Button_Importisothermeq,1)
    HideGadget(#Button_Importisotherm,1)
    HideGadget(#Button_ImportLFKorrelation,1)
    HideGadget(#Button_ImportTemp,1)
    HideGadget(#CheckBox_usevoltage,1)
    HideGadget(#Button_ExportCS,1)

    HideGadget(#Text_Spannung,1)
    HideGadget(#Text_Abnahme1,1)
    HideGadget(#Text_Abnahme2, 1)
    HideGadget(#Text_Porositaet,1)
    HideGadget(#Text_Zementierungsfaktor,1)
    HideGadget(#Text_Saettigung, 1)
    HideGadget(#Text_Saettigungsexponent, 1)
    HideGadget(#Text_LFKorrelationskoeffizient, 1)
    HideGadget(#Text_temperaturkoeffizient,1)
    HideGadget(#String_Spannung, 1)
    HideGadget(#String_Abnahme1, 1)
    HideGadget(#String_Abnahme2, 1)
    HideGadget(#String_Porositaet, 1)
    HideGadget(#String_Zementierungsfaktor, 1)
    HideGadget(#String_Saettigung, 1)
    HideGadget(#String_Saettigungsexponent, 1)
    HideGadget(#String_LFKorrelationskoeffizient, 1)
    HideGadget(#CheckBox_usetemp,1)
    HideGadget(#String_temperaturkoeffizient, 1)
    
    HideGadget(#String_vol_dfz_in,1)
    HideGadget(#String_conc_dfz_in,1)
    HideGadget(#String_vol_dfz_ef,1)
    HideGadget(#String_conc_dfz_ef,1)
    HideGadget(#Text_vol_dfz_in,1)
    HideGadget(#Text_conc_dfz_in,1)
    HideGadget(#Text_vol_dfz_ef,1)
    HideGadget(#Text_conc_dfz_ef,1)
    
    HideGadget(#Text_theta_immobile, 1)
    HideGadget(#Text_massentransfer_immobile, 1)
    HideGadget(#String_theta_immobile, 1)
    HideGadget(#String_massentransfer_immobile, 1)
    HideGadget(#Button_sens_Windows,1)
    HideGadget(#Button_Hilfe,1)
    HideGadget(#CheckBox_addnoise,1)
    HideGadget(#Text_sigma,1)
    HideGadget(#String_sigma,1)
    
    
    HideGadget(#CheckBox_usefittedisotherm,1)
    HideGadget(#CheckBox_usefittedisothermeq,1)
    HideGadget(#CheckBox_usefittedlf,1)
    HideGadget(#CheckBox_converttolf,1)
    HideGadget(#CheckBox_drawfft,1)
    HideGadget(#Button_Mouse,1)
  EndIf
    first=0
    Repeat    ;erste schelife vor ffnung des Plotfensters
      event=WaitWindowEvent()
      
      ExamineKeyboard()
      transfer_boxes_to_variable()     
      check_values()      
      check_buttons()
      If (EventGadget()=#Button_Beenden) Or (event=#PB_Event_CloseWindow) Or KeyboardPushed(#PB_Key_Escape)
        If MessageRequester("Warnung","Wirklich Beenden?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes       
          shutdown()
        EndIf  
      EndIf
      
    Until (EventGadget()=#Button_Start) Or KeyboardReleased(#PB_Key_Return)
    
    ; Diskretisierungsparameterbrechung frs erste Mal
    
    length=maxx-minx
    nodes=length/deltax
    nodesalt=nodes
    bound_up=dbkmaxtime
    n_frakt=Round(dbkmaxtime/frakt_deltat,#PB_Round_Down)
    dbkpoint_imp=0
    fraktpoint=0
    n_dbk=dbkmaxtime/dbk_deltat
    n_dbk_alt=n_dbk
    conc_vg_init_alt=conc_vg_init
    frakt_deltat_alt=frakt_deltat_start
    Q_alt=Q_start
    dbk_deltat_alt=dbk_deltat
    deltax_alt=deltax
   
  EndIf  
  
EndProcedure

Procedure.d show_extrema(silent.i=0)
  
  string.s
  first_local.i=1
  first_max.d
  first_inflection.d=1
  first_local_inflection.i=1
  Dim dbkdt.d(n_dbk)
  Dim dbkdt2.d(n_dbk)
  Dim vgdt.d(n_dbk)
  Dim vgdt2.d(n_dbk)
  Dim dfzindt.d(n_dbk)
  Dim dfzindt2.d(n_dbk)
  Dim dfzefdt.d(n_dbk)
  Dim dfzefdt2.d(n_dbk)
  
  For i=1 To n_dbk-1  ;Berechung der Ableitungen
    dbkdt(i)=(dbk_implicit(i+1)-dbk_implicit(i))/(dbk_deltat)
    dbkdt2(i)=(dbk_implicit(i+1)-2*dbk_implicit(i)+dbk_implicit(i-1))/(dbk_deltat*dbk_deltat)
    dfzindt(i)=(dbk_dfz_in(i+1)-dbk_dfz_in(i))/(dbk_deltat)
    dfzindt2(i)=(dbk_dfz_in(i+1)-2*dbk_dfz_in(i)+dbk_dfz_in(i-1))/(dbk_deltat*dbk_deltat)
    dfzefdt(i)=(dbk_dfz_ef(i+1)-dbk_dfz_ef(i))/(dbk_deltat)
    dfzefdt2(i)=(dbk_dfz_ef(i+1)-2*dbk_dfz_ef(i)+dbk_dfz_ef(i-1))/(dbk_deltat*dbk_deltat)
    vgdt(i)=(dbk_implicit_vg(i+1)-dbk_implicit_vg(i))/(dbk_deltat)
    vgdt2(i)=(dbk_implicit_vg(i+1)-2*dbk_implicit_vg(i)+dbk_implicit_vg(i-1))/(dbk_deltat*dbk_deltat)
  Next i
  dbkdt(0)=(dbk_implicit(1)-dbk_implicit(0))/dbk_deltat
  dbkdt(n_dbk)=(dbk_implicit(n_dbk)-dbk_implicit(n_dbk-1))/dbk_deltat
  dbkdt2(0)=dbkdt2(1)
  dbkdt2(n_dbk)=dbkdt2(n_dbk-1)
  dfzindt(0)=(dbk_dfz_in(1)-dbk_dfz_in(2))/dbk_deltat
  dfzindt(n_dbk)=(dbk_dfz_in(n_dbk)-dbk_dfz_in(n_dbk-1))/dbk_deltat
  dfzindt2(0)=dfzindt2(1)
  dfzindt2(n_dbk)=dfzindt2(n_dbk-1)
  dfzefdt(0)=(dbk_dfz_ef(1)-dbk_dfz_ef(0))/dbk_deltat
  dfzefdt(n_dbk)=(dbk_dfz_ef(n_dbk)-dbk_dfz_ef(n_dbk-1))/dbk_deltat
  dfzefdt2(0)=dfzefdt2(1)
  dfzefdt2(n_dbk)=dfzefdt2(n_dbk-1)
  vgdt(0)=(dbk_implicit_vg(1)-dbk_implicit_vg(0))/dbk_deltat
  vgdt(n_dbk)=(dbk_implicit_vg(n_dbk)-dbk_implicit_vg(n_dbk-1))/dbk_deltat
  vgdt2(0)=vgdt2(1)
  vgdt2(n_dbk)=vgdt2(n_dbk-1)
  
  string+"1. Ableitung DBK"+Chr(9)
  For i=1 To n_dbk-1
    If (dbkdt(i+1)>0 And dbkdt(i+2)>0 And dbkdt(i)<0 And dbkdt(i-1)<0) Or (dbkdt(i+1)<0 And dbkdt(i+2)<0 And dbkdt(i)>0 And dbkdt(i-1)>0)
      string+StrD(dbk_pv(i),4)+Chr(9)
    EndIf      
  Next i    
  string+#eol
  string+"2. Ableitung DBK"+Chr(9)
  For i=1 To n_dbk-1
    If (dbkdt2(i+1)>0 And dbkdt2(i+2)>0 And dbkdt2(i)<0 And dbkdt2(i-1)<0) Or (dbkdt2(i+1)<0 And dbkdt2(i+2)<0 And dbkdt2(i)>0 And dbkdt2(i-1)>0)
      string+StrD(dbk_pv(i),4)+Chr(9)
      If first_local_inflection:first_local_inflection=0:first_inflection=dbk_pv(i):EndIf
    EndIf      
  Next i    
  string+#eol
  string+"1. Ableitung DFZ in"+Chr(9)
  For i=1 To n_dbk-1
    If (dfzindt(i+1)>0 And dfzindt(i+2)>0 And dfzindt(i)<0 And dfzindt(i-1)<0) Or (dfzindt(i+1)<0 And dfzindt(i+2)<0 And dfzindt(i)>0 And dfzindt(i-1)>0)
      string+StrD(dbk_pv(i),4)+Chr(9)
    EndIf      
  Next i    
  string+#eol
  string+"2. Ableitung DFZ in"+Chr(9)
  For i=1 To n_dbk-1
    If (dfzindt2(i+1)>0 And dfzindt2(i+2)>0 And dfzindt2(i)<0 And dfzindt2(i-1)<0) Or (dfzindt2(i+1)<0 And dfzindt2(i+2)<0 And dfzindt2(i)>0 And dfzindt2(i-1)>0)
      string+StrD(dbk_pv(i),4)+Chr(9)
    EndIf      
  Next i
  string+#eol
  string+"1. Ableitung DFZ ef"+Chr(9)
  For i=1 To n_dbk-1
    If (dfzefdt(i+1)>0 And dfzefdt(i+2)>0 And dfzefdt(i)<0 And dfzefdt(i-1)<0) Or (dfzefdt(i+1)<0 And dfzefdt(i+2)<0 And dfzefdt(i)>0 And dfzefdt(i-1)>0)
      string+StrD(dbk_pv(i),4)+Chr(9)
    EndIf      
  Next i    
  string+#eol
  string+"2. Ableitung DFZ ef"+Chr(9)
  For i=1 To n_dbk-1
    If (dfzefdt2(i+1)>0 And dfzefdt2(i+2)>0 And dfzefdt2(i)<0 And dfzefdt2(i-1)<0) Or (dfzefdt2(i+1)<0 And dfzefdt2(i+2)<0 And dfzefdt2(i)>0 And dfzefdt2(i-1)>0)
      string+StrD(dbk_pv(i),4)+Chr(9)
    EndIf      
  Next i  
  string+#eol
  string+"1. Ableitung VG"+Chr(9)
  For i=1 To n_dbk-1
    If (vgdt(i+1)>0 And vgdt(i+2)>0 And vgdt(i)<0 And vgdt(i-1)<0) Or (vgdt(i+1)<0 And vgdt(i+2)<0 And vgdt(i)>0 And vgdt(i-1)>0)
      string+StrD(dbk_pv(i),4)+Chr(9)
      If second_local:first_max=dbk_pv(i):EndIf
      second_local=0
      If first_local:second_local=1:EndIf
      first_local=0
    EndIf      
  Next i    
  string+#eol
  string+"2. Ableitung VG"+Chr(9)
  For i=1 To n_dbk-1
    If (vgdt2(i+1)>0 And vgdt2(i+2)>0 And vgdt2(i)<0 And vgdt2(i-1)<0) Or (vgdt2(i+1)<0 And vgdt2(i+2)<0 And vgdt2(i)>0 And vgdt2(i-1)>0)
      string+StrD(dbk_pv(i),4)+Chr(9)
    EndIf      
  Next i    
  string+#eol
  retardation_local.d=1
  k_local.d=(length*grundflaeche*theta_ges)/vol_vg  
  deltax_local.d=0.001
  For i=0 To 20
    f_local.d=1/k_local*(1-Exp(-k_local*retardation_local))+retardation_local-first_max
    retardation_local2.d=retardation_local*1.001
    retardation_local=retardation_local-(f_local)/(((1/k_local*(1-Exp(-k_local*retardation_local2))+retardation_local2-first_max)-f_local)/deltax_local)
  Next i
  string+"Retardation from first maxmimum of mixing vessel: "+StrD(retardation_local)
  If Not silent
    MessageRequester("Extrempunkte",string)
  Else
    If kreislauf
      ProcedureReturn retardation_local
    Else
      ProcedureReturn first_inflection
    EndIf  
  EndIf  
  
EndProcedure  

Procedure export_conc() ;exportiert Konzentrationsverteilung in der Sule und Ableitungen in txt
  
  Dim cdx.d(nodes)
  Dim cdx2.d(nodes)
  Dim sdx.d(nodes)
  Dim sdx2.d(nodes)
  Dim seqdx.d(nodes)
  Dim seqdx2.d(nodes)
  Dim bacdx.d(nodes)
  Dim bacdx2.d(nodes)
  temp.s
  temp=SaveFileRequester("Select File",directory+"ExportConc","Text (*.txt)|*.txt|Bild (*.png)|*.png|Alle Dateien (*.*)|*.*",0)
  If temp
    directory=GetPathPart(temp)
    SetWindowTitle(0,"Parameter | "+directory)
  EndIf
  
  If SelectedFilePattern()=0 And Not GetExtensionPart(temp)="txt"
    temp+".txt"    
  EndIf
  If SelectedFilePattern()=1 And Not GetExtensionPart(temp)="png"
    temp+".png"
  EndIf
  
  If check_overwrite(temp)
    
    If SelectedFilePattern()=1  ;wenn als png gespeichert wird
      
      CloseFile(0)
      CreateImage(0, 640, 480 , 32)
      StartDrawing(ImageOutput(0))
      DrawingMode(#PB_2DDrawing_Default) 
      BackColor(RGB(255,255,255))
      FrontColor(RGB(0,0,0))
      Box(0,0,640,480,RGB(255,255,255))
      LineXY(40,20, 40, 445 ) 
      LineXY(35,440, 620, 440 ) 
      LineXY(35,40,40,40)
      LineXY(600,440,600,445)
      DrawText(1, 32, StrD(max,2) )
      DrawText(1, 432, StrD(min,2) )
      DrawText(17, 200,"c")
      DrawText(28, 450, StrD(minx,2) )
      DrawText(590, 450, StrD(maxx,2))
      DrawText(315, 450,"x")
      
      If drawconc
        draw_conc(@drawconc_implicit(),farbec)
      EndIf
      
      If drawS
        draw_conc(@drawS_implicit(),farbes)
      EndIf
      
      If drawseq
        draw_conc(@drawseq(),farbeseq)
      EndIf
      
      If drawbac
        draw_conc(@draw_bakterien(),farbebac)
      EndIf
            
      StopDrawing()
      
      If SaveImage(0,temp, #PB_ImagePlugin_PNG)
        MessageRequester("Information","Saved "+GetFilePart(temp)) 
      Else
        MessageRequester("Fehler","Could not create file")    
      EndIf
      
    Else ;wenn als ASCII textfile gespeichert wird
      
      For i=2 To nodes-1    ;Berechung der Ableitungen
        cdx(i)=(conc_implicit(i+1)-conc_implicit(i-1))/(2*deltax)
        cdx2(i)=(conc_implicit(i+1)-2*conc_implicit(i)+conc_implicit(i-1))/(deltax*deltax)
        sdx(i)=(S_implicit(i+1)-S_implicit(i-1))/(2*deltax)
        sdx2(i)=(S_implicit(i+1)-2*S_implicit(i)+S_implicit(i-1))/(deltax*deltax)
        seqdx(i)=(Seq(i+1)-Seq(i-1))/(2*deltax)
        seqdx2(i)=(Seq(i+1)-2*Seq(i)+Seq(i-1))/(deltax*deltax)
        bacdx(i)=(bakterien(i+1)-bakterien(i-1))/(2*deltax)
        bacdx2(i)=(bakterien(i+1)-2*bakterien(i)+bakterien(i-1))/(deltax*deltax)
      Next i
      cdx(1)=(conc_implicit(2)-conc_implicit(1))/deltax
      cdx(nodes)=(conc_implicit(nodes)-conc_implicit(nodes-1))/deltax
      cdx2(1)=cdx2(2)
      cdx2(nodes)=cdx2(nodes-1)
      sdx(1)=(S_implicit(2)-S_implicit(1))/deltax
      sdx(nodes)=(S_implicit(nodes)-S_implicit(nodes-1))/deltax
      sdx2(1)=sdx2(2)
      sdx2(nodes)=sdx2(nodes-1)
      seqdx(1)=(Seq(2)-Seq(1))/deltax
      seqdx(nodes)=(Seq(nodes)-Seq(nodes-1))/deltax
      seqdx2(1)=seqdx2(2)
      seqdx2(nodes)=seqdx2(nodes-1)
      bacdx(1)=(bakterien(2)-bakterien(1))/deltax
      bacdx(nodes)=(bakterien(nodes)-bakterien(nodes-1))/deltax
      bacdx2(1)=bacdx2(2)
      bacdx2(nodes)=bacdx2(nodes-1)
      
      WriteString(0,"x"+Chr(9))
      WriteString(0,"Conc"+Chr(9))
      WriteString(0,"d/dx(Conc)"+Chr(9))
      WriteString(0,"d/dx(Conc)"+Chr(9))
      WriteString(0,"Sneq"+Chr(9))
      WriteString(0,"d/dx(Sneq)"+Chr(9))
      WriteString(0,"d/dx(Sneq)"+Chr(9))
      WriteString(0,"Seq"+Chr(9))
      WriteString(0,"d/dx(Seq)"+Chr(9))
      WriteString(0,"d/dx(Seq)"+Chr(9)) 
      WriteString(0,"Bakterien"+Chr(9))
      WriteString(0,"d/dx(Bak)"+Chr(9))
      WriteStringN(0,"d/dx(Bak)")
      For i=1 To nodes
        WriteString(0,StrD(i*deltax-minx)+Chr(9))
        WriteString(0,StrD(conc_implicit(i))+Chr(9))
        WriteString(0,StrD(cdx(i))+Chr(9))
        WriteString(0,StrD(cdx2(i))+Chr(9))
        WriteString(0,StrD(S_implicit(i))+Chr(9))
        WriteString(0,StrD(sdx(i))+Chr(9))
        WriteString(0,StrD(sdx2(i))+Chr(9))
        WriteString(0,StrD(Seq(i))+Chr(9))
        WriteString(0,StrD(seqdx(i))+Chr(9))
        WriteString(0,StrD(seqdx2(i))+Chr(9))
        WriteString(0,StrD(bakterien(i))+Chr(9))
        WriteString(0,StrD(bacdx(i))+Chr(9))
        WriteStringN(0,StrD(bacdx2(i)))
      Next i
      
      WriteString(0,"1. Ableitung C"+Chr(9))
      For i=1 To nodes-1
        If (cdx(i+1)>0 And cdx(i)<0) Or (cdx(i+1)<0 And cdx(i)>0)
          WriteString(0,StrD(i*deltax-minx)+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"2. Ableitung C"+Chr(9))
      For i=1 To nodes-1
        If (cdx2(i+1)>0 And cdx2(i)<0) Or (cdx2(i+1)<0 And cdx2(i)>0)
          WriteString(0,StrD(i*deltax-minx)+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"1. Ableitung Sneq"+Chr(9))
      For i=1 To nodes-1
        If (sdx(i+1)>0 And sdx(i)<0) Or (sdx(i+1)<0 And sdx(i)>0)
          WriteString(0,StrD(i*deltax-minx)+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"2. Ableitung Sneq"+Chr(9))
      For i=1 To nodes-1
        If (sdx2(i+1)>0 And sdx2(i)<0) Or (sdx2(i+1)<0 And sdx2(i)>0)
          WriteString(0,StrD(i*deltax-minx)+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"1. Ableitung Seq"+Chr(9))
      For i=1 To nodes-1
        If (seqdx(i+1)>0 And seqdx(i)<0) Or (seqdx(i+1)<0 And seqdx(i)>0)
          WriteString(0,StrD(i*deltax-minx)+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"2. Ableitung Seq"+Chr(9))
      For i=1 To nodes-1
        If (seqdx2(i+1)>0 And seqdx2(i)<0) Or (seqdx2(i+1)<0 And seqdx2(i)>0)
          WriteString(0,StrD(i*deltax-minx)+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"1. Ableitung Bakterien"+Chr(9))
      For i=1 To nodes-1
        If (bacdx(i+1)>0 And bacdx(i)<0) Or (bacdx(i+1)<0 And bacdx(i)>0)
          WriteString(0,StrD(i*deltax-minx)+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"2. Ableitung Bakterien"+Chr(9))
      For i=1 To nodes-1
        If (bacdx2(i+1)>0 And bacdx2(i)<0) Or (bacdx2(i+1)<0 And bacdx2(i)>0)
          WriteString(0,StrD(i*deltax-minx)+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      
      CloseFile(0)
      MessageRequester("Information","Saved "+GetFilePart(temp))
      
    EndIf
  EndIf  
  
EndProcedure

Procedure export_dbk()  ;exportiert Durchbruchskurve, VG und DFZ und Ableitungen in txt
  
  Dim dbkdt.d(n_dbk)
  Dim dbkdt2.d(n_dbk)
  Dim vgdt.d(n_dbk)
  Dim vgdt2.d(n_dbk)
  Dim dfzindt.d(n_dbk)
  Dim dfzindt2.d(n_dbk)
  Dim dfzefdt.d(n_dbk)
  Dim dfzefdt2.d(n_dbk)
  Dim stromdt.d(n_dbk)
  Dim stromdt2.d(n_dbk)
  Dim spannungdt.d(n_dbk)
  Dim spannungdt2.d(n_dbk)
  first_local.i=1
  second_local.i=0
  first_max.d=1
  
  temp.s
  temp=SaveFileRequester("Select File",directory+"ExportDBK","Text (*.txt)|*.txt|Bild (*.png)|*.png|Alle Dateien (*.*)|*.*",0)
  If temp 
    directory=GetPathPart(temp)
    SetWindowTitle(0,"Parameter | "+directory)
  EndIf
  
  If SelectedFilePattern()=0 And Not GetExtensionPart(temp)="txt"
    temp+".txt"    
  EndIf
  If SelectedFilePattern()=1 And Not GetExtensionPart(temp)="png"
    temp+".png"
  EndIf
  
  If check_overwrite(temp)
    
    If SelectedFilePattern()=1 ; wenn als pngfile gespeichert wird
      
      CloseFile(0)
      CreateImage(0, 640, 480 , 32)
      StartDrawing(ImageOutput(0))
      DrawingMode(#PB_2DDrawing_Default) 
      BackColor(RGB(255,255,255))
      FrontColor(RGB(0,0,0))
      Box(0,0,640,480,RGB(255,255,255))
      LineXY(40,20, 40, 445 ) 
      LineXY(35,440, 620, 440 ) 
      LineXY(35,40,40,40)
      LineXY(600,440,600,445)
      DrawText(1, 32, StrD(max,2) )
      DrawText(1, 432, "0" )
      DrawText(17, 200,"c")
      DrawText(28, 450, "0" )
      DrawText(560, 450, StrD(dbkmaxtime,2))
      DrawText(315, 450,"t")
      
      If drawdbk
        draw_conc(@drawdbk_implicit(),farbedbk)
      EndIf
      
      If drawvg  
        draw_conc(@drawdbk_implicit_vg(),farbevg)
      EndIf   
      
      If drawimport
        For i=1 To n_imp
          If drawdbk_import(i)\x<561 And drawdbk_import(i)\x>=0
            Circle(drawdbk_import(i)\x+40,240-drawdbk_import(i)\y,2,farbeimp)
          EndIf
        Next i
      EndIf
      
      If drawfrakt
        For i=1 To n_frakt
          If drawdbk_frakt(i)\x<561 And drawdbk_frakt(i)\x>=0        
            Circle(drawdbk_frakt(i)\x+40,240-drawdbk_frakt(i)\y,2,farbefrakt)
          EndIf
        Next i
      EndIf
      
      If drawdfz_in
        draw_conc(@drawdbk_dfz_in(),farbedfz_in)
      EndIf
      
      If drawdfz_ef
        draw_conc(@drawdbk_dfz_ef(),farbedfz_ef)
      EndIf
      
      If drawstrom
        draw_conc(@drawstrom(),farbestrom)
      EndIf
      
      If drawspannung
        draw_conc(@drawspannung(),farbespannung)
      EndIf  
      
      StopDrawing()
      
      If SaveImage(0,temp, #PB_ImagePlugin_PNG)
        MessageRequester("Information","Saved "+GetFilePart(temp)) 
      Else
        MessageRequester("Fehler","Could not create file")    
      EndIf
      
    Else  ;speichern als ASCII textfile
      
      For i=1 To n_dbk-1  ;Berechung der Ableitungen
        dbkdt(i)=(dbk_implicit(i+1)-dbk_implicit(i))/(dbk_deltat)
        dbkdt2(i)=(dbk_implicit(i+1)-2*dbk_implicit(i)+dbk_implicit(i-1))/(dbk_deltat*dbk_deltat)
        dfzindt(i)=(dbk_dfz_in(i+1)-dbk_dfz_in(i))/(dbk_deltat)
        dfzindt2(i)=(dbk_dfz_in(i+1)-2*dbk_dfz_in(i)+dbk_dfz_in(i-1))/(dbk_deltat*dbk_deltat)
        dfzefdt(i)=(dbk_dfz_ef(i+1)-dbk_dfz_ef(i))/(dbk_deltat)
        dfzefdt2(i)=(dbk_dfz_ef(i+1)-2*dbk_dfz_ef(i)+dbk_dfz_ef(i-1))/(dbk_deltat*dbk_deltat)
        vgdt(i)=(dbk_implicit_vg(i+1)-dbk_implicit_vg(i))/(dbk_deltat)
        vgdt2(i)=(dbk_implicit_vg(i+1)-2*dbk_implicit_vg(i)+dbk_implicit_vg(i-1))/(dbk_deltat*dbk_deltat)
        spannungdt(i)=(spannung(i+1)-spannung(i))/(dbk_deltat)
        spannungdt2(i)=(spannung(i+1)-2*spannung(i)+spannung(i-1))/(dbk_deltat*dbk_deltat)
        stromdt(i)=(strom(i+1)-strom(i))/(dbk_deltat)
        stromdt2(i)=(strom(i+1)-2*strom(i)+strom(i-1))/(dbk_deltat*dbk_deltat)
      Next i
      dbkdt(0)=(dbk_implicit(1)-dbk_implicit(0))/dbk_deltat
      dbkdt(n_dbk)=(dbk_implicit(n_dbk)-dbk_implicit(n_dbk-1))/dbk_deltat
      dbkdt2(0)=dbkdt2(1)
      dbkdt2(n_dbk)=dbkdt2(n_dbk-1)
      dfzindt(0)=(dbk_dfz_in(1)-dbk_dfz_in(2))/dbk_deltat
      dfzindt(n_dbk)=(dbk_dfz_in(n_dbk)-dbk_dfz_in(n_dbk-1))/dbk_deltat
      dfzindt2(0)=dfzindt2(1)
      dfzindt2(n_dbk)=dfzindt2(n_dbk-1)
      dfzefdt(0)=(dbk_dfz_ef(1)-dbk_dfz_ef(0))/dbk_deltat
      dfzefdt(n_dbk)=(dbk_dfz_ef(n_dbk)-dbk_dfz_ef(n_dbk-1))/dbk_deltat
      dfzefdt2(0)=dfzefdt2(1)
      dfzefdt2(n_dbk)=dfzefdt2(n_dbk-1)
      vgdt(0)=(dbk_implicit_vg(1)-dbk_implicit_vg(0))/dbk_deltat
      vgdt(n_dbk)=(dbk_implicit_vg(n_dbk)-dbk_implicit_vg(n_dbk-1))/dbk_deltat
      vgdt2(0)=vgdt2(1)
      vgdt2(n_dbk)=vgdt2(n_dbk-1)
      spannungdt(0)=(spannung(1)-spannung(0))/dbk_deltat
      spannungdt(n_dbk)=(spannung(n_dbk)-spannung(n_dbk-1))/dbk_deltat
      spannungdt2(0)=spannungdt2(1)
      spannungdt2(n_dbk)=spannungdt2(n_dbk-1)
      stromdt(0)=(strom(1)-strom(0))/dbk_deltat
      stromdt(n_dbk)=(strom(n_dbk)-strom(n_dbk-1))/dbk_deltat
      stromdt2(0)=stromdt2(1)
      stromdt2(n_dbk)=stromdt2(n_dbk-1)
      WriteString(0,"time"+Chr(9))
      WriteString(0,"pv"+Chr(9))
      WriteString(0,"dbk"+Chr(9))
      WriteString(0,"d/dt(dbk)"+Chr(9))
      WriteString(0,"d/dt(dbk)"+Chr(9))
      WriteString(0,"dfz in"+Chr(9))
      WriteString(0,"d/dt(dfz in)"+Chr(9))
      WriteString(0,"d/dt(dfz in)"+Chr(9))
      WriteString(0,"dfz ef"+Chr(9))
      WriteString(0,"d/dt(dfz ef)"+Chr(9))
      WriteString(0,"d/dt(dfz ef)"+Chr(9))
      WriteString(0,"vg"+Chr(9))
      WriteString(0,"d/dt(vg)"+Chr(9))
      WriteString(0,"d/dt(vg)"+Chr(9))
      WriteString(0,"Spannung"+Chr(9))
      WriteString(0,"d/dt(Spannung)"+Chr(9))
      WriteString(0,"d/dt(Spannung)"+Chr(9))   
      WriteString(0,"Strom"+Chr(9))
      WriteString(0,"d/dt(Strom)"+Chr(9))
      WriteString(0,"d/dt(Strom)"+Chr(9))
      WriteStringN(0,"bulk LF")
      For i=0 To n_dbk
        WriteString(0,StrD(i*dbk_deltat)+Chr(9))
        WriteString(0,StrD(dbk_pv(i))+Chr(9))
        WriteString(0,StrD(dbk_implicit(i))+Chr(9))
        WriteString(0,StrD(dbkdt(i))+Chr(9))
        WriteString(0,StrD(dbkdt2(i))+Chr(9))
        WriteString(0,StrD(dbk_dfz_in(i))+Chr(9))
        WriteString(0,StrD(dfzindt(i))+Chr(9))
        WriteString(0,StrD(dfzindt2(i))+Chr(9))
        WriteString(0,StrD(dbk_dfz_ef(i))+Chr(9))
        WriteString(0,StrD(dfzefdt(i))+Chr(9))
        WriteString(0,StrD(dfzefdt2(i))+Chr(9))
        WriteString(0,StrD(dbk_implicit_vg(i))+Chr(9))
        WriteString(0,StrD(vgdt(i))+Chr(9)) 
        WriteString(0,StrD(vgdt2(i))+Chr(9))
        WriteString(0,StrD(spannung(i))+Chr(9))
        WriteString(0,StrD(spannungdt(i))+Chr(9))
        WriteString(0,StrD(spannungdt2(i))+Chr(9))
        WriteString(0,StrD(strom(i))+Chr(9))
        WriteString(0,StrD(stromdt(i))+Chr(9))
        WriteString(0,StrD(stromdt2(i))+Chr(9))
        WriteStringN(0,StrD(strom(i)/spannung_gesamt*length/grundflaeche))
      Next i
      
      WriteString(0,"1. Ableitung DBK"+Chr(9))
      For i=1 To n_dbk-1
        If (dbkdt(i+1)>0 And dbkdt(i+2)>0 And dbkdt(i)<0 And dbkdt(i-1)<0) Or (dbkdt(i+1)<0 And dbkdt(i+2)<0 And dbkdt(i)>0 And dbkdt(i-1)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"2. Ableitung DBK"+Chr(9))
      For i=1 To n_dbk-1
        If (dbkdt2(i+1)>0 And dbkdt2(i+2)>0 And dbkdt2(i)<0 And dbkdt2(i-1)<0) Or (dbkdt2(i+1)<0 And dbkdt2(i+2)<0 And dbkdt2(i)>0 And dbkdt2(i-1)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"1. Ableitung DFZ in"+Chr(9))
      For i=1 To n_dbk-1
        If (dfzindt(i+1)>0 And dfzindt(i+2)>0 And dfzindt(i)<0 And dfzindt(i-1)<0) Or (dfzindt(i+1)<0 And dfzindt(i+2)<0 And dfzindt(i)>0 And dfzindt(i-1)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"2. Ableitung DFZ in"+Chr(9))
      For i=1 To n_dbk-1
        If (dfzindt2(i+1)>0 And dfzindt2(i+2)>0 And dfzindt2(i)<0 And dfzindt2(i-1)<0) Or (dfzindt2(i+1)<0 And dfzindt2(i+2)<0 And dfzindt2(i)>0 And dfzindt2(i-1)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i
      WriteStringN(0,"")
      WriteString(0,"1. Ableitung DFZ ef"+Chr(9))
      For i=1 To n_dbk-1
        If (dfzefdt(i+1)>0 And dfzefdt(i+2)>0 And dfzefdt(i)<0 And dfzefdt(i-1)<0) Or (dfzefdt(i+1)<0 And dfzefdt(i+2)<0 And dfzefdt(i)>0 And dfzefdt(i-1)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"2. Ableitung DFZ ef"+Chr(9))
      For i=1 To n_dbk-1
        If (dfzefdt2(i+1)>0 And dfzefdt2(i+2)>0 And dfzefdt2(i)<0 And dfzefdt2(i-1)<0) Or (dfzefdt2(i+1)<0 And dfzefdt2(i+2)<0 And dfzefdt2(i)>0 And dfzefdt2(i-1)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i  
      WriteStringN(0,"")
      WriteString(0,"1. Ableitung VG"+Chr(9))
      For i=1 To n_dbk-1
        If (vgdt(i+1)>0 And vgdt(i+2)>0 And vgdt(i)<0 And vgdt(i-1)<0) Or (vgdt(i+1)<0 And vgdt(i+2)<0 And vgdt(i)>0 And vgdt(i-1)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
          If second_local:first_max=dbk_pv(i):EndIf
          second_local=0
          If first_local:second_local=1:EndIf
          first_local=0
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"2. Ableitung VG"+Chr(9))
      For i=1 To n_dbk-1
        If (vgdt2(i+1)>0 And vgdt2(i+2)>0 And vgdt2(i)<0 And vgdt2(i-1)<0) Or (vgdt2(i+1)<0 And vgdt2(i+2)<0 And vgdt2(i)>0 And vgdt2(i-1)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"1. Ableitung Spannung"+Chr(9))
      For i=1 To n_dbk-1
        If (spannungdt(i+1)>0 And spannungdt(i)<0) Or (spannungdt(i+1)<0 And spannungdt(i)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"2. Ableitung Spannung"+Chr(9))
      For i=1 To n_dbk-1
        If (spannungdt2(i+1)>0 And spannungdt2(i)<0) Or (spannungdt2(i+1)<0 And spannungdt2(i)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"1. Ableitung Strom"+Chr(9))
      For i=1 To n_dbk-1
        If (stromdt(i+1)>0 And stromdt(i)<0) Or (stromdt(i+1)<0 And stromdt(i)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      WriteString(0,"2. Ableitung Strom"+Chr(9))
      For i=1 To n_dbk-1
        If (stromdt2(i+1)>0 And stromdt2(i)<0) Or (stromdt2(i+1)<0 And stromdt2(i)>0)
          WriteString(0,StrD(i*dbk_deltat)+";"+StrD(dbk_pv(i))+Chr(9))
        EndIf      
      Next i    
      WriteStringN(0,"")
      
      retardation_local.d=1
      k_local.d=(length*grundflaeche*theta_ges)/vol_vg  
      deltax_local.d=0.001
      For i=0 To 20
        f_local.d=1/k_local*(1-Exp(-k_local*retardation_local))+retardation_local-first_max
        retardation_local2.d=retardation_local*1.001
        retardation_local=retardation_local-(f_local)/(((1/k_local*(1-Exp(-k_local*retardation_local2))+retardation_local2-first_max)-f_local)/deltax_local)
      Next i
      WriteStringN(0,"Retardation from first maximum of mixing vessel:"+Chr(9)+StrD(retardation_local))
      
      WriteStringN(0,"time"+Chr(9)+"Fraktion")
      For i=1 To n_frakt
        If fraktionen(i)\x>0
          WriteString(0,StrD(fraktionen(i)\x)+Chr(9))
          WriteStringN(0,StrD(fraktionen(i)\y))
        EndIf  
      Next i
      
      CloseFile(0)
      MessageRequester("Information","Saved "+GetFilePart(temp)) 
      
    EndIf
  EndIf  
  
EndProcedure

Procedure convert_array_to_scale(Array SourceArray.d(1), Array DrawArray.d(1),knoten.l,scale.d,mode.b)  ;Konvertiert Konzentrationsverteilung in darstellbare Skalierung
  ;vom SourceArray auf einen Zeichenarray, d.h. SourceArray bleibt unverndert 
  
;to do
  
EndProcedure

Procedure convert_to_scale()  ;Konvertiert Konzentrationsverteilung in darstellbare Skalierung
  
 ;to do 
  
EndProcedure

Procedure.d archie(lf.d)
  result.d
  result=Pow(porositaet,zementierungsfaktor)*Pow(saettigung,saettigungsexponent)*lf  
  ProcedureReturn result
EndProcedure  

Procedure.d get_temp(currenttime.d)
  
  result.d
  previousp.d
  previousrange.d
  
  previousp=tempgang(1)\y
  previousrange=tempgang(1)\x
  If currenttime<tempgang(1)\x
    ProcedureReturn tempgang(1)\y
  EndIf  
  
  If currenttime<tempgang(n_temp)\x
    For i=2 To n_temp
      If (currenttime<tempgang(i)\x And currenttime>=tempgang(i-1)\x)
        result=((tempgang(i)\y-previousp)/(tempgang(i)\x-previousrange))*(currenttime-previousrange)+previousp
        Break
      EndIf
      previousp=tempgang(i)\y
      previousrange=tempgang(i)\x
    Next i
  Else
    result=tempgang(n_temp)\y
  EndIf  
  
  ProcedureReturn result
  
EndProcedure  

Procedure.d leitf(conc.d)   ;gibt die LF einer Konzentration anhand der gewhlten Korrelation zurck
  result.d
  previousp.d
  previousrange.d
  If Not usefittedlf
    result=lfkorrelationskoeffizient*conc
  Else
    previousp=0
    previousrange=0
    For i=1 To n_lfkorr
      If conc<lfkorrelation(i)\x Or i=n_lfkorr
        result=((lfkorrelation(i)\y-previousp)/(lfkorrelation(i)\x-previousrange))*(conc-previousrange)+previousp
        Break
      EndIf
      previousp=lfkorrelation(i)\y
      previousrange=lfkorrelation(i)\x
    Next i
  EndIf
  
  If usetemp
    result*(1+temperaturkoeffizient*(get_temp(time)-25))  
  EndIf
  
  ProcedureReturn result
EndProcedure

Procedure.d isotherme(conc.d)  ;Isotherme nach freundlich oder linear stckweise; Argument C, Funktionswert S(equil)
  
  result.d
  previousp.d
  previousrange.d
  temp.l
  temp1.d
  If Not conc>0:ProcedureReturn 0:EndIf
  If Not usefittedisotherm
    Select isotherme
      Case 1  
        !fldcw [v_roundmode]
        !fld1    ;berechnet Kd*Pow(conc,freund_n)
        !fld qword [v_Kd]
        !fyl2x
        !fld qword [v_freund_n]
        !fld qword [p.v_conc]
        !fyl2x
        !faddp
        !fist dword [p.v_temp]
        !fild dword [p.v_temp]
        !fxch st1
        !fsub st0,st1
        !f2xm1
        !fld1
        !faddp
        !mov eax,[p.v_temp]
        !shl eax,20
        !add eax, 3FF00000H
        !mov dword [p.v_temp1],0
        !mov dword [p.v_temp1+4],eax
        !fld qword [p.v_temp1]
        !fmulp
        !fstp qword [p.v_result]
        !fstp st0
        !fldcw [v_FPU_ControlWord]
      Case 2
        result=Kd*conc*freund_n/(1+Kd*conc)
    EndSelect
  Else
    previousp=0
    previousrange=0
    For i=1 To n_iso
      If conc<linearisotherm(i)\x Or i=n_iso
        result=((linearisotherm(i)\y-previousp)/(linearisotherm(i)\x-previousrange))*(conc-previousrange)+previousp
        Break
      EndIf
      previousp=linearisotherm(i)\y
      previousrange=linearisotherm(i)\x
    Next i
  EndIf  
  If result<0:result=0:EndIf
  ProcedureReturn result
  
EndProcedure

Procedure.d isothermeq(conc.d)  ;Isotherme nach freundlich oder linear stckweise; Argument C, Funktionswert S(equil)
  
  result.d
  previousp.d
  previousrange.d
  temp.l
  temp1.d
  If Not conc>0:ProcedureReturn 0:EndIf
  If Not usefittedisothermeq
    Select isotherme
      Case 1  
        !fldcw [v_roundmode]
        !fld1    ;berechnet Kd_eq*Pow(conc,freund_n_eq)
        !fld qword [v_Kd_eq]
        !fyl2x
        !fld qword [v_freund_n_eq]
        !fld qword [p.v_conc]
        !fyl2x
        !faddp
        !fist dword [p.v_temp]
        !fild dword [p.v_temp]
        !fxch st1
        !fsub st0,st1
        !f2xm1
        !fld1
        !faddp
        !mov eax,[p.v_temp]
        !shl eax,20
        !add eax, 3FF00000H
        !mov dword [p.v_temp1],0
        !mov dword [p.v_temp1+4],eax
        !fld qword [p.v_temp1]
        !fmulp
        !fstp qword [p.v_result]
        !fstp st0
        !fldcw [v_FPU_ControlWord]
      Case 2
        result=Kd_eq*conc*freund_n_eq/(1+Kd_eq*conc)
    EndSelect    
  Else
    previousp=0
    previousrange=0
    For i=1 To n_isoeq
      If conc<linearisothermeq(i)\x Or i=n_isoeq
        result=((linearisothermeq(i)\y-previousp)/(linearisothermeq(i)\x-previousrange))*(conc-previousrange)+previousp
        Break
      EndIf
      previousp=linearisothermeq(i)\y
      previousrange=linearisothermeq(i)\x
    Next i
  EndIf
ProcedureReturn result
  
EndProcedure

Procedure.d equil_newton(sum.d,suchtiefe.l,weite.d,koeff.d,K.d,exponent.d,thet.d,ngg.b)  ;sucht nach Gleichgewichtszustand der Isotherme; Argument Summe aus C und S, iterationstiefen
  
  conc.d
  iso.d
  iso1.d
  temp.l
  temp1.d
  If Not sum>0:ProcedureReturn 0:EndIf
  
    conc=sum/(thet+koeff*K) 
    If (exponent=1 And Not ((usefittedisotherm And ngg) Or (usefittedisothermeq And Not ngg) Or isotherme=2)) Or K=0:ProcedureReturn conc:EndIf 
    If Not ((usefittedisotherm And ngg) Or (usefittedisothermeq And Not ngg) Or isotherme=2)
      !fldcw [v_roundmode]
      For i=1 To suchtiefe    
        !fld1                   ;   1           
        !fld qword [p.v_K]       ;   Kd            1
        !fyl2x                  ;   lnKd  
        !fld qword [p.v_exponent] ;   freund_n      lnKd
        !fld st0                ;   freund_n      freund_n      ln Kd
        !fld qword [p.v_conc]   ;   conc          freund_n      freund_n      ln Kd
        !fxch                   ;   freund_n      conc          freund_n      ln Kd
        !fld st1                ;   conc          freund_n      conc          freund_n      ln Kd
        !fyl2x                  ;   fr*lnc        conc          freund_n      ln Kd
        !fadd st0,st3           ;   lnKd+fr*lnc   conc          freund_n      ln Kd
        !fist dword [p.v_temp]
        !fild dword [p.v_temp]
        !fxch                   ;   lnKd+fr*lnc   Rd            conc          freund_n      ln Kd
        !fsub st0,st1           ;   0.iwas        Rd            conc          freund_n      ln Kd
        !f2xm1                  ;   2^0.iwas-1    Rd            conc          freund_n      ln Kd
        !fld1                   ;   1             2^0.iwas-1    Rd            conc          freund_n      ln Kd
        !faddp                  ;   2^0.iwas      Rd            conc          freund_n      ln Kd
        !mov eax,[p.v_temp]
        !shl eax,20
        !add eax, 3FF00000H
        !mov dword [p.v_temp1],0
        !mov dword [p.v_temp1+4],eax
        !fld qword [p.v_temp1]
        !fmulp
        !fstp qword [p.v_iso];   Rd            conc          freund_n      ln Kd
        !fstp st0               ;   conc          freund_n      ln Kd
        !fld qword [p.v_weite]  ;   weite         conc          freund_n      ln Kd
        !faddp
        !fyl2x
        !faddp
        !fist dword [p.v_temp]
        !fild dword [p.v_temp]
        !fxch
        !fsub st0,st1
        !f2xm1
        !fld1
        !faddp
        !mov eax,[p.v_temp]
        !shl eax,20
        !add eax, 3FF00000H
        !mov dword [p.v_temp1],0
        !mov dword [p.v_temp1+4],eax
        !fld qword [p.v_temp1]
        !fmulp
        !fstp qword [p.v_iso1]
        !fstp st0
        conc-weite*(sum-conc*thet-iso*koeff)/(iso*koeff-weite-iso1*koeff)
      Next i  
      !fldcw [v_FPU_ControlWord]  
    ElseIf isotherme=2 And Not ((usefittedisotherm And ngg) Or (usefittedisothermeq And Not ngg))
      conc=(Sqr(K*K*sum*sum+2*K*sum*(thet-K*koeff*exponent)+Pow(K*koeff*exponent+thet,2))+K*sum-K*koeff*exponent-thet)/(2*K*thet)
    Else
      If ngg
        For i=1 To suchtiefe
          iso=isotherme(conc)
          conc-weite*(sum-conc*thet-iso*koeff)/(iso*koeff-weite-isotherme(conc+weite)*koeff)
        Next i
      Else
        For i=1 To suchtiefe
          iso=isothermeq(conc)
          conc-weite*(sum-conc*thet-iso*koeff)/(iso*koeff-weite-isothermeq(conc+weite)*koeff)
        Next i
      EndIf
    EndIf  
  
  If conc<0:conc=0:EndIf
  
  ProcedureReturn conc
  
EndProcedure

Procedure solve_matrix()  ;berechnet Inverse der Matrix (im Prinzip, stark an Problem angepasst, Lsung analytisch, nicht numerisch) zum Verrechnen mit Zielvektor
  
  Dim tempmatrix.d(4,nodes)
  For i=1 To nodes    
    tempmatrix(2,i)=1+2*((Diff+long_Disp)*deltat/(deltax*deltax))
    tempmatrix(3,i)=-((Diff+long_Disp)*deltat/(deltax*deltax))+v*deltat/(2*deltax)
    tempmatrix(1,i)=-((Diff+long_Disp)*deltat/(deltax*deltax))-v*deltat/(2*deltax)  
  Next i
  tempmatrix(1,1)=0
  tempmatrix(2,1)=1+((Diff+long_Disp)*deltat/(deltax*deltax))+v*deltat/(deltax)
  tempmatrix(3,1)=-((Diff+long_Disp)*deltat/(deltax*deltax))
  If kreislauf
    ;tempmatrix(4,1)=-v*deltat*deltat*Q/(deltax*(Q*deltat+vol_vg))
    If vol_dfz_ef And vol_dfz_in
      tempmatrix(4,1)=-v*deltat/deltax*(Q*Q*Q*deltat*deltat*deltat/((Q*deltat+vol_dfz_ef)*(Q*deltat+vol_dfz_in)*(Q*deltat+vol_vg)))
    ElseIf vol_dfz_ef
      tempmatrix(4,1)=-v*deltat/deltax*(Q*Q*deltat*deltat/((Q*deltat+vol_dfz_ef)*(Q*deltat+vol_vg)))
    ElseIf vol_dfz_in
      tempmatrix(4,1)=-v*deltat/deltax*(Q*Q*deltat*deltat/((Q*deltat+vol_dfz_in)*(Q*deltat+vol_vg)))
    Else  
      tempmatrix(4,1)=-v*deltat*deltat*Q/(deltax*(Q*deltat+vol_vg))
    EndIf  
  EndIf
  ;tempmatrix(1,nodes)=-v*deltat/(2*deltax)-((Diff+long_Disp)*deltat/(deltax*deltax))
  tempmatrix(2,nodes)=1+v*deltat/(2*deltax)+((Diff+long_Disp)*deltat/(deltax*deltax))

  tempmatrix(3,nodes)=0
;   For i=1 To nodes    
;     tempmatrix(2,i)=1+2*((Diff+long_Disp)*deltat/(deltax*deltax))
;     tempmatrix(3,i)=-((Diff+long_Disp)*deltat/(deltax*deltax))+v*deltat/(2*deltax)
;     tempmatrix(1,i)=-((Diff+long_Disp)*deltat/(deltax*deltax))-v*deltat/(2*deltax)  
;   Next i
;   tempmatrix(1,1)=0
;   tempmatrix(2,1)=1+((Diff+long_Disp)*deltat/(deltax*deltax))+v*deltat/(deltax)
;   tempmatrix(3,1)=-((Diff+long_Disp)*deltat/(deltax*deltax))
;   ;tempmatrix(1,nodes)=-v*deltat/(2*deltax)-((Diff+long_Disp)*deltat/(deltax*deltax))
;   tempmatrix(2,nodes)=1+v*deltat/(2*deltax)+((Diff+long_Disp)*deltat/(deltax*deltax))
;   tempmatrix(3,nodes)=0
  
  ;Matrix untere Nebendiagonale eliminieren
  
  For j=1 To (nodes-1)
    matrix(1,j)=tempmatrix(1,j+1)/tempmatrix(2,j)
    ;tempmatrix(1,j+1)-matrix(1,j)*tempmatrix(2,j)
    tempmatrix(2,j+1)-matrix(1,j)*tempmatrix(3,j)
    tempmatrix(4,j+1)-matrix(1,j)*tempmatrix(4,j)
  Next j     
  
  tempmatrix(4,nodes)+tempmatrix(2,nodes)
  ;tempmatrix(4,nodes-1)+tempmatrix(3,nodes-1)
  
  ; Fill in korrigieren
  
  For j=1 To (nodes-1)
    matrix(4,nodes-j)=tempmatrix(4,nodes-j)/tempmatrix(4,nodes)
    ;tempmatrix(4,nodes-j)-matrix(4,nodes-j+1)*tempmatrix(4,nodes-j+1)
    ;tempmatrix(3,nodes-j)-matrix(4,nodes-j+1)*tempmatrix(2,nodes-j+1)
    ;tempmatrix(2,nodes-j)-matrix(4,nodes-j+1)*tempmatrix()
  Next j
  
  ;Matrix obere Nebendiagonale eliminieren
  
  For j=1 To (nodes-1)
    matrix(3,nodes-j)=tempmatrix(3,nodes-j)/tempmatrix(2,nodes-j+1)
    ;tempmatrix(3,nodes-j)-matrix(3,nodes-j)*tempmatrix(2,nodes-j+1) 
  Next j
  
  ;Matrix Hauptdiagonale auf 1 normieren
  
  For i=1 To nodes
    matrix(2,i)=tempmatrix(2,i)
  Next i
  
EndProcedure

Procedure check_flussunterbrechungen()   ; Auswirkung der Flussunterbechungen
  
  If (flussU_s1-deltat/2<time And flussU_s1+deltat/2>time) Or (flussU_s2-deltat/2<time And flussU_s2+deltat/2>time) Or (flussU_s3-deltat/2<time And flussU_s3+deltat/2>time) Or (flussU_s4-deltat/2<time And flussU_s4+deltat/2>time) Or (flussU_s5-deltat/2<time And flussU_s5+deltat/2>time) Or (flussU_s6-deltat/2<time And flussU_s6+deltat/2>time) Or (flussU_s7-deltat/2<time And flussU_s7+deltat/2>time) Or (flussU_s8-deltat/2<time And flussU_s8+deltat/2>time) Or (flussU_s9-deltat/2<time And flussU_s9+deltat/2>time) Or (flussU_s10-deltat/2<time And flussU_s10+deltat/2>time)
    
    n_frakt+1
    ReDim fraktionen.xy(n_frakt)
    ReDim drawdbk_frakt.xy(n_frakt)
    fraktpoint+1
    fraktionen(fraktpoint)\x=dbktime
    If frakt_vol>0
      fraktionen(fraktpoint)\y=fraktsum/frakt_vol
    Else
      fraktionen(fraktpoint)\y=0
    EndIf
    frakt_time=-deltat
    frakt_vol=0
    fraktsum=0 
    
    flussunterbrechung=1
    Q_merken=Q
    Q=0
    v=0
    long_Disp=0
    solve_matrix()
  EndIf
  If (flussU_e1-deltat/2<time And flussU_e1+deltat/2>time) Or (flussU_e2-deltat/2<time And flussU_e2+deltat/2>time) Or (flussU_e3-deltat/2<time And flussU_e3+deltat/2>time) Or (flussU_e4-deltat/2<time And flussU_e4+deltat/2>time) Or (flussU_e5-deltat/2<time And flussU_e5+deltat/2>time) Or (flussU_e6-deltat/2<time And flussU_e6+deltat/2>time) Or (flussU_e7-deltat/2<time And flussU_e7+deltat/2>time) Or (flussU_e8-deltat/2<time And flussU_e8+deltat/2>time) Or (flussU_e9-deltat/2<time And flussU_e9+deltat/2>time) Or (flussU_e10-deltat/2<time And flussU_e10+deltat/2>time)
    flussunterbrechung=0
    If weiterQ1 And (flussU_e1-deltat/2<time And flussU_e1+deltat/2>time)
      Q=weiterQ1
    ElseIf weiterQ2 And (flussU_e2-deltat/2<time And flussU_e2+deltat/2>time)
      Q=weiterQ2
    ElseIf weiterQ3 And (flussU_e3-deltat/2<time And flussU_e3+deltat/2>time)
      Q=weiterQ3
    ElseIf weiterQ4 And(flussU_e4-deltat/2<time And flussU_e4+deltat/2>time)
      Q=weiterQ4
    ElseIf weiterQ5 And(flussU_e5-deltat/2<time And flussU_e5+deltat/2>time)
      Q=weiterQ5
    ElseIf weiterQ6 And(flussU_e6-deltat/2<time And flussU_e6+deltat/2>time)
      Q=weiterQ6
    ElseIf weiterQ7 And(flussU_e7-deltat/2<time And flussU_e7+deltat/2>time)
      Q=weiterQ7
    ElseIf weiterQ8 And(flussU_e8-deltat/2<time And flussU_e8+deltat/2>time) 
      Q=weiterQ8
    ElseIf weiterQ9 And(flussU_e9-deltat/2<time And flussU_e9+deltat/2>time) 
      Q=weiterQ9
    ElseIf weiterQ10 And(flussU_e10-deltat/2<time And flussU_e10+deltat/2>time) 
      Q=weiterQ10
    Else
      Q=Q_merken
    EndIf
    v=Q/(grundflaeche*theta)
    If (flussU_e1-deltat/2<time And flussU_e1+deltat/2>time)
      If weiterc1>=0
        conc_vg_imp=weiterc1
      EndIf  
      If weiterf1 
        frakt_deltat=weiterf1
      EndIf
      If weitervol1>0
        vol_vg=weitervol1
      EndIf  
    ElseIf (flussU_e2-deltat/2<time And flussU_e2+deltat/2>time)
      If weiterc2>=0
        conc_vg_imp=weiterc2
      EndIf 
      If weiterf2 
        frakt_deltat=weiterf2
      EndIf
      If weitervol2>0
        vol_vg=weitervol2
      EndIf  
    ElseIf (flussU_e3-deltat/2<time And flussU_e3+deltat/2>time)
      If weiterc3>=0
        conc_vg_imp=weiterc3
      EndIf 
      If weiterf3 
        frakt_deltat=weiterf3
      EndIf
      If weitervol3>0
        vol_vg=weitervol3
      EndIf  
    ElseIf (flussU_e4-deltat/2<time And flussU_e4+deltat/2>time)
      If weiterc4>=0
        conc_vg_imp=weiterc4
      EndIf 
      If weiterf4 
        frakt_deltat=weiterf4
      EndIf
      If weitervol4>0
        vol_vg=weitervol4
      EndIf  
    ElseIf (flussU_e5-deltat/2<time And flussU_e5+deltat/2>time)
      If weiterc5>=0
        conc_vg_imp=weiterc5
      EndIf 
      If weiterf5 
        frakt_deltat=weiterf5
      EndIf
      If weitervol5>0
        vol_vg=weitervol5
      EndIf  
    ElseIf (flussU_e6-deltat/2<time And flussU_e6+deltat/2>time)
      If weiterc6>=0
        conc_vg_imp=weiterc6
      EndIf 
      If weiterf6 
        frakt_deltat=weiterf6
      EndIf
      If weitervol6>0
        vol_vg=weitervol6
      EndIf  
    ElseIf (flussU_e7-deltat/2<time And flussU_e7+deltat/2>time)
      If weiterc7>=0
        conc_vg_imp=weiterc7
      EndIf 
      If weiterf7 
        frakt_deltat=weiterf7
      EndIf
      If weitervol7>0
        vol_vg=weitervol7
      EndIf  
    ElseIf (flussU_e8-deltat/2<time And flussU_e8+deltat/2>time)
      If weiterc8>=0
        conc_vg_imp=weiterc8
      EndIf 
      If weiterf8 
        frakt_deltat=weiterf8
      EndIf
      If weitervol8>0
        vol_vg=weitervol8
      EndIf
    ElseIf (flussU_e9-deltat/2<time And flussU_e9+deltat/2>time)
      If weiterc9>=0
        conc_vg_imp=weiterc9
      EndIf 
      If weiterf9 
        frakt_deltat=weiterf9
      EndIf
      If weitervol9>0
        vol_vg=weitervol9
      EndIf 
    ElseIf (flussU_e10-deltat/2<time And flussU_e10+deltat/2>time)
      If weiterc10>=0
        conc_vg_imp=weiterc10
      EndIf 
      If weiterf10
        frakt_deltat=weiterf10
      EndIf
      If weitervol10>0
        vol_vg=weitervol10
      EndIf   
    EndIf
    
    long_Disp=v*dispersivity
    solve_matrix()
    set_scale()
  EndIf
  
EndProcedure

Procedure get_check_values()    ; berechnung aller prfwerte
  tempmax.d
  ;Integral und Peak berechnen
  
  tempmax=conc_implicit(1)
  sum_check_imp=0
  S_check_imp=0
  Seq_check_imp=0
  
  For i=1 To nodes
    If conc_implicit(i)>tempmax
      tempmax=conc_implicit(i)
      peak_imp=i*deltax+minx
    EndIf
    sum_check_imp+conc_implicit(i)*deltax*grundflaeche*theta+conc_immobile(i)*deltax*grundflaeche*theta_im
    S_check_imp+S_implicit(i)*deltax*grundflaeche*(1-verteilung)*lagerungsdichte*(1-theta_im_anteil)+S_immobile(i)*deltax*grundflaeche*(1-verteilung)*lagerungsdichte*theta_im_anteil
    Seq_check_imp+Seq(i)*deltax*grundflaeche*lagerungsdichte*verteilung*(1-theta_im_anteil)+Seq_immobile(i)*deltax*grundflaeche*lagerungsdichte*verteilung*theta_im_anteil
  Next i
  
  dbk_check=0
  dfz_in_check=0
  dfz_ef_check=0
  vg_check=0
  
  For i=0 To n_dbk
    dbk_check+dbk_implicit(i)*dbk_deltat*v*grundflaeche*theta
    dfz_in_check+dbk_dfz_in(i)*dbk_deltat*v*grundflaeche*theta
    dfz_ef_check+dbk_dfz_ef(i)*dbk_deltat*v*grundflaeche*theta
    vg_check+dbk_implicit_vg(i)*dbk_deltat*v*grundflaeche*theta
  Next i
  
EndProcedure

Procedure.d minmod(a.d,b.d)
  If Abs(a)<=Abs(b) And a*b>0
    ProcedureReturn a
  ElseIf Abs(b)<Abs(a) And a*b>0
    ProcedureReturn b
  Else
    ProcedureReturn 0
  EndIf  
EndProcedure  

Procedure.d maxmod(a.d,b.d)
  If Abs(a)>=Abs(b)
    ProcedureReturn a
  Else
    ProcedureReturn b
  EndIf  
EndProcedure  

Procedure.d superbee(i.i)
  ProcedureReturn maxmod(minmod((conc_implicit(i+1)-conc_implicit(i))/deltax,2*(conc_implicit(i)-conc_implicit(i-1))/deltax),minmod(2*(conc_implicit(i+1)-conc_implicit(i))/deltax,(conc_implicit(i)-conc_implicit(i-1))/deltax))
EndProcedure  
  
Procedure calculate_next_timestep_implicit()  ;Berechnung des nchstes Zeitschrittes
  
  anfangszustand=0
  
  flux.d=Q*deltat
  koeffneq.d=(1-verteilung)*lagerungsdichte*(1-theta_im_anteil)
  koeffeq.d=verteilung*lagerungsdichte*(1-theta_im_anteil)
  
  koeffneq_im.d=(1-verteilung)*lagerungsdichte*theta_im_anteil
  koeffeq_im.d=verteilung*lagerungsdichte*theta_im_anteil
  
  time+deltat     ;zeit luft weiter
  
  If recorddbk; And (kreislauf Or Not flussunterbrechung)
    If Not flussunterbrechung Or drawflussunterbrechung
      dbktime+deltat
    EndIf  
  EndIf   
  
  sorp.d
  observpoint.i
  sorpequil.d
  concequil.d
  concmob.d
  concimob.d
  transfermob.d
  transferimob.d
  
  ;flussunterbrechungen
  
  check_flussunterbrechungen()
  
  ;Nichtgleichgewichtssorption
  
  If usesorption And verteilung<1
    rate.d=koeffneq/theta*kr*deltat
    rate_im.d=koeffneq_im/theta_im*kr*deltat
    thetaanteil.d=theta/koeffneq
    thetaanteil_im.d=theta_im/koeffneq_im
    If sorptionmode=1  ;alte Version ohne Stabilittsprfung fr Sorptionsrate
      For i=1 To nodes  
        sorp=rate*(isotherme(conc_implicit(i))-S_implicit(i))
        conc_implicit(i)-sorp
        S_implicit(i)+sorp*thetaanteil
      Next i
      If theta_im>0
        For i=1 To nodes
          sorp=rate_im*(isotherme(conc_immobile(i))-S_immobile(i))
          conc_immobile(i)-sorp
          S_immobile(i)+sorp*thetaanteil_im
        Next i  
      EndIf  
    EndIf  
    
    If sorptionmode>1 ;neue Version mit Stabilittsprfung fr Sorptionsrate, dauert ewig 
      
      For i=1 To nodes   
        sorp=rate*(isotherme(conc_implicit(i))-S_implicit(i))
        concequil=equil_newton(conc_implicit(i)*theta+S_implicit(i)*koeffneq,10,0.01,koeffneq,Kd,freund_n,theta,1)
        sorpequil=(conc_implicit(i)*theta+S_implicit(i)*koeffneq-concequil*theta)/koeffneq      
        If sorp*thetaanteil+S_implicit(i)*koeffneq>sorpequil*koeffneq And sorp>0 
          conc_implicit(i)=concequil
          S_implicit(i)=sorpequil           
        ElseIf sorp*thetaanteil+S_implicit(i)*koeffneq<sorpequil*koeffneq And sorp<0 
          conc_implicit(i)=concequil
          S_implicit(i)=sorpequil
        Else
          conc_implicit(i)-sorp
          S_implicit(i)+sorp*thetaanteil
        EndIf
      Next i
      
      If theta_im>0
        
        For i=1 To nodes   
          sorp=rate_im*(isotherme(conc_immobile(i))-S_immobile(i))
          concequil=equil_newton(conc_immobile(i)*theta_im+S_immobile(i)*koeffneq_im,10,0.01,koeffneq_im,Kd,freund_n,theta_im,1)
          sorpequil=(conc_immobile(i)*theta_im+S_immobile(i)*koeffneq_im-concequil*theta_im)/koeffneq_im      
          If sorp*thetaanteil_im+S_immobile(i)*koeffneq_im>sorpequil*koeffneq_im And sorp>0 
            conc_immobile(i)=concequil
            S_immobile(i)=sorpequil           
          ElseIf sorp*thetaanteil_im+S_immobile(i)*koeffneq_im<sorpequil*koeffneq_im And sorp<0 
            conc_immobile(i)=concequil
            S_immobile(i)=sorpequil
          Else
            conc_immobile(i)-sorp
            S_immobile(i)+sorp*thetaanteil_im
          EndIf
        Next i
        
      EndIf  
      
    EndIf  
    
  EndIf
  
 
  If theta_im>0
    For i=1 To nodes
      concmob=conc_implicit(i)
      concimob=conc_immobile(i)
      transfermob=mass_trans_im*(concmob-concimob)*deltat/theta
      transferimob=transfermob*theta/theta_im;mass_trans_im*(concmob-concimob)*deltat/theta_im
      If (concimob+transferimob>concmob And transferimob>0) Or (concimob+transferimob<concmob And transferimob<0)
        conc_implicit(i)=(concmob*theta+concimob*theta_im)/theta_ges
        conc_immobile(i)=conc_implicit(i)
      Else
        conc_implicit(i)-transfermob
        conc_immobile(i)+transferimob
      EndIf
    Next i  
  EndIf  
    
  ;Abbau Produktion
  If abbau_1<>0 Or produktion<>0
    For i=1 To nodes
      ;conc_implicit(i)-(abbau_1*bakterien(i)-produktion)*deltat
      conc_implicit(i)-(abbau_1*conc_implicit(i)-produktion)*deltat
      If conc_implicit(i)<0:conc_implicit(i)=0:EndIf
    Next i  
  EndIf
    
  If implicit

    If kreislauf
      If vol_dfz_ef And vol_dfz_in
        conc_implicit(1)+v*deltat/deltax*((conc_vg_imp*(flux*vol_vg*(flux+vol_dfz_ef))+conc_dfz_ef*(flux*flux*vol_dfz_ef)+conc_dfz_in*(vol_dfz_in*(flux+vol_vg)*(flux+vol_dfz_ef)))/((flux+vol_dfz_ef)*(flux+vol_dfz_in)*(flux+vol_vg)));
        conc_dfz_in=(flux*conc_vg_imp+conc_dfz_in*(vol_dfz_in-flux))/vol_dfz_in  ;       
      ElseIf vol_dfz_ef
        conc_implicit(1)+v*deltat/deltax*((conc_vg_imp*(vol_vg*(flux+vol_dfz_ef))+conc_dfz_ef*(flux*vol_dfz_ef))/((flux+vol_dfz_ef)*(flux+vol_vg)))
      ElseIf vol_dfz_in
        conc_implicit(1)+v*deltat/deltax*((conc_vg_imp*(vol_vg*flux)+conc_dfz_in*(vol_dfz_in*(flux+vol_vg)))/((flux+vol_dfz_in)*(flux+vol_vg)))
        conc_dfz_in=(flux*conc_vg_imp+conc_dfz_in*(vol_dfz_in-flux))/vol_dfz_in   
      Else  
        conc_implicit(1)+v*deltat/deltax*(conc_vg_imp*vol_vg/(flux+vol_vg));conc_vg_imp*v*deltat*vol_vg/(deltax*(Q*deltat+vol_vg));(v*deltat/(deltax))*conc_vg_imp
      EndIf   
    Else
      conc_implicit(1)+(v*deltat/(deltax))*conc_vg_imp 
    EndIf
  ;EndIf 
  ;Matrix verrechnen
  *matrixpointer=@matrix(1,1)
  *concpointer=@conc_implicit(1)
  !mov ecx,[v_nodes]
  !mov ebx,[p.p_matrixpointer]
  !mov eax,[p.p_concpointer]
  !dec ecx
  !.schleife1:    
  !fld qword [eax]
  !fld qword [ebx]
  !add eax,8h
  !fmulp    
  !fld qword [eax]
  !fsubrp
  !fstp qword [eax]
  !add ebx,8h
  !loop .schleife1
   If kreislauf
  ;zweite schleife
  *matrixpointer=@matrix(4,nodes-1)
  *concpointer=@conc_implicit(nodes)  
  !mov ecx,[v_nodes]
  !mov ebx,[p.p_matrixpointer]
  !mov eax,[p.p_concpointer]
  !dec ecx
  !fld qword [eax]
  !.schleife2:  
  !fld qword [ebx]
  !sub eax,8h
  !fmul st0,st1 
  !fld qword [eax]
  !fsubrp
  !fstp qword [eax]
  !sub ebx,8h
  !loop .schleife2
  !fstp st0
  EndIf
  ;dritte schleife
  *matrixpointer=@matrix(3,nodes-1)
  *concpointer=@conc_implicit(nodes)  
  !mov ecx,[v_nodes]
  !mov ebx,[p.p_matrixpointer]
  !dec ecx
  !mov eax,[p.p_concpointer]
  !.schleife3:
  !fld qword [eax]
  !fld qword [ebx]
  !sub eax,8h
  !fmulp    
  !fld qword [eax]
  !fsubrp
  !fstp qword [eax]
  !sub ebx,8h
  !loop .schleife3
  ;vierte schleife
  *matrixpointer=@matrix(2,1)
  *concpointer=@conc_implicit(1)
  !mov ecx,[v_nodes]
  !mov ebx,[p.p_matrixpointer]
  !mov eax,[p.p_concpointer]
  !.schleife4:
  !fld qword [ebx]
  !fld qword [eax]
  !fdivrp
  !fstp qword [eax]
  !add ebx,8h
  !add eax,8h
  !loop .schleife4   

Else
  effluent.d=conc_implicit(nodes)
  Dim temp_conc.d(nodes)
   If vol_dfz_in
     conc_dfz_in=(flux*conc_vg_imp+conc_dfz_in*(vol_dfz_in-flux))/vol_dfz_in
    temp_conc(1)=conc_implicit(1)+deltat*((Diff+long_Disp)*(conc_implicit(2)-conc_implicit(1))/(deltax*deltax)-v*((conc_implicit(1)-conc_dfz_in)/deltax))    
    temp_conc(0)=conc_implicit(1)
  Else
    temp_conc(1)=conc_implicit(1)+deltat*((Diff+long_Disp)*(conc_implicit(2)-conc_implicit(1))/(deltax*deltax)-v*((conc_implicit(1)-conc_vg_imp)/deltax))
    temp_conc(0)=conc_implicit(1)  
  EndIf
    ;temp_conc(2)=conc_implicit(2)+deltat*((Diff+long_Disp)*(conc_implicit(3)-2*conc_implicit(2)+conc_implicit(1))/(deltax*deltax)-v*((conc_implicit(2)-conc_implicit(1))/deltax))
    For i=2 To nodes-1
      temp_conc(i)=conc_implicit(i)+deltat*((Diff+long_Disp)*((conc_implicit(i+1)-2*conc_implicit(i)+conc_implicit(i-1))/(deltax*deltax))-v/deltax*(conc_implicit(i)-conc_implicit(i-1))-v/2*(1-v*deltat/deltax)*(superbee(i)-superbee(i-1))); superbee(i));minmod((conc_implicit(i+1)-conc_implicit(i))/deltax,(conc_implicit(i)-conc_implicit(i-1))/deltax));superbee(i))
    Next i
    temp_conc(nodes)=conc_implicit(nodes)+deltat*((Diff+long_Disp)*(conc_implicit(nodes-1)-conc_implicit(nodes))/(deltax*deltax)-v*(conc_implicit(i)-conc_implicit(i-1))/deltax)
    CopyArray(temp_conc(),conc_implicit())
  EndIf

  
  ;neue Konzentration des Vorratsgefes/DFZ im Kreislauf
  If implicit
  If vol_dfz_ef
    conc_dfz_ef=(flux*conc_implicit(nodes)+conc_dfz_ef*vol_dfz_ef)/(vol_dfz_ef+flux);(flux*conc_implicit(nodes)+conc_dfz_ef*(vol_dfz_ef-flux))/vol_dfz_ef
  EndIf
  
  If kreislauf
    If vol_dfz_ef
      conc_vg_imp=(flux*conc_dfz_ef+conc_vg_imp*vol_vg)/(vol_vg+flux);(flux*conc_dfz_ef+conc_vg_imp*(vol_vg-flux))/vol_vg
    Else
      conc_vg_imp=(vol_vg*conc_vg_imp+flux*conc_implicit(nodes))/(vol_vg+flux);(flux*conc_implicit(nodes)+conc_vg_imp*(vol_vg-flux))/vol_vg
    EndIf
  EndIf 
Else
  If vol_dfz_ef
    dfz_ef.d=conc_dfz_ef
    conc_dfz_ef=(flux*effluent+conc_dfz_ef*(vol_dfz_ef-flux))/(vol_dfz_ef);(flux*conc_implicit(nodes)+conc_dfz_ef*(vol_dfz_ef-flux))/vol_dfz_ef
  EndIf
  
  If kreislauf
    If vol_dfz_ef
      conc_vg_imp=(flux*dfz_ef+conc_vg_imp*(vol_vg-flux))/(vol_vg);(flux*conc_dfz_ef+conc_vg_imp*(vol_vg-flux))/vol_vg
    Else
      conc_vg_imp=(effluent*flux+conc_vg_imp*(vol_vg-flux))/(vol_vg);(flux*conc_implicit(nodes)+conc_vg_imp*(vol_vg-flux))/vol_vg
    EndIf
  EndIf
  EndIf
  
  
  If recorddbk And Not flussunterbrechung
    frakt_time+deltat
    frakt_vol+flux
    If vol_dfz_ef
      fraktsum+conc_dfz_ef*flux
    Else
      fraktsum+conc_implicit(nodes)*flux
    EndIf 
  EndIf
  
  ;Gleichgewichtssorption
  
  If usesorption And verteilung>0
    For i=1 To nodes   
      concequil=equil_newton(conc_implicit(i)*theta+Seq(i)*koeffeq,10,0.01,koeffeq,Kd_eq,freund_n_eq,theta,0)   
      sorpequil=(conc_implicit(i)*theta+Seq(i)*koeffeq-concequil*theta)/koeffeq      
      conc_implicit(i)=concequil
      Seq(i)=sorpequil
    Next i
    If theta_im>0
      For i=1 To nodes   
        concequil=equil_newton(conc_immobile(i)*theta_im+Seq_immobile(i)*koeffeq_im,10,0.01,koeffeq_im,Kd_eq,freund_n_eq,theta_im,0)
        sorpequil=(conc_immobile(i)*theta_im+Seq_immobile(i)*koeffeq_im-concequil*theta_im)/koeffeq_im      
        conc_immobile(i)=concequil
        Seq_immobile(i)=sorpequil
      Next i
    EndIf  
    
  EndIf  
  
  observpoint=(obspoint-minx)/deltax
  
  If usevoltage
    R_gesamt=0
    R_bereich=0
    meanlf=0
    For i=1 To nodes
      R_gesamt+deltax/(archie(leitf(conc_implicit(i)))*grundflaeche)
      If i*deltax>spannungsabnahme1 And i*deltax<=spannungsabnahme2
        R_bereich+deltax/(archie(leitf(conc_implicit(i)))*grundflaeche)
      EndIf
      meanlf+leitf(conc_implicit(i))
    Next i
    meanlf/nodes
    stromfluss=spannung_gesamt/R_gesamt
    spannung_bereich=stromfluss*R_bereich
  EndIf
  
  ;Durchbruchskurven erweitern
  
  While dbkpoint_imp<n_dbk And (dbkpoint_imp+1)*dbk_deltat<=dbktime+#num_tolerance
    dbkpoint_imp+1 
    If converttolf
      If flux_conc
        dbk_implicit(dbkpoint_imp)=leitf(conc_implicit(observpoint)-(Diff+long_Disp)/v*(conc_implicit(observpoint)-conc_implicit(observpoint-1))/deltax)
      Else  
        dbk_implicit(dbkpoint_imp)=leitf(conc_implicit(observpoint))
      EndIf  
      dbk_implicit_vg(dbkpoint_imp)=leitf(conc_vg_imp)
      dbk_dfz_in(dbkpoint_imp)=leitf(conc_dfz_in)
      dbk_dfz_ef(dbkpoint_imp)=leitf(conc_dfz_ef)
    Else
      If flux_conc
        dbk_implicit(dbkpoint_imp)=conc_implicit(observpoint)-(Diff+long_Disp)/v*(conc_implicit(observpoint)-conc_implicit(observpoint-1))/deltax
      Else  
        dbk_implicit(dbkpoint_imp)=conc_implicit(observpoint)
      EndIf
      dbk_implicit_vg(dbkpoint_imp)=conc_vg_imp
      dbk_dfz_in(dbkpoint_imp)=conc_dfz_in
      dbk_dfz_ef(dbkpoint_imp)=conc_dfz_ef
    EndIf
    strom(dbkpoint_imp)=stromfluss
    spannung(dbkpoint_imp)=spannung_bereich
    dbk_pv(dbkpoint_imp)=dbk_pv(dbkpoint_imp-1)+v*dbk_deltat/length
    If addnoise
      dbk_implicit(dbkpoint_imp)=get_normal_rnd(dbk_implicit(dbkpoint_imp),sigma*dbk_implicit(dbkpoint_imp));*Sqr(dbk_implicit(dbkpoint_imp)))
      dbk_implicit_vg(dbkpoint_imp)=get_normal_rnd(dbk_implicit_vg(dbkpoint_imp),sigma*dbk_implicit(dbkpoint_imp));*Sqr(dbk_implicit_vg(dbkpoint_imp)))
      dbk_dfz_in(dbkpoint_imp)=get_normal_rnd(dbk_dfz_in(dbkpoint_imp),sigma*dbk_implicit(dbkpoint_imp));*Sqr(dbk_dfz_in(dbkpoint_imp)))
      dbk_dfz_ef(dbkpoint_imp)=get_normal_rnd(dbk_dfz_ef(dbkpoint_imp),sigma*dbk_implicit(dbkpoint_imp));*Sqr(dbk_dfz_ef(dbkpoint_imp)))
    EndIf  
  Wend
  
  
  If frakt_time+#num_tolerance>=frakt_deltat And dbktime<=dbkmaxtime
    
    ;If fraktionen(fraktpoint)\x<=dbkmaxtime And n_frakt=fraktpoint
      n_frakt+1
      ReDim fraktionen.xy(n_frakt)
      ReDim drawdbk_frakt.xy(n_frakt)
    ;EndIf
    
    fraktpoint+1
    fraktionen(fraktpoint)\x=dbktime
    If frakt_vol>0
      fraktionen(fraktpoint)\y=fraktsum/frakt_vol
    Else
      fraktionen(fraktpoint)\y=0
    EndIf
    frakt_time=0
    frakt_vol=0
    fraktsum=0
  EndIf    
  
  If verdunstung
    stoffmenge.d=vol_vg*conc_vg_imp
    vol_vg-verdunstung*deltat
    conc_vg_imp=stoffmenge/vol_vg
  EndIf  
  
EndProcedure

Procedure draw_conc(*ArrayPointer,farbe.l)  ;Zeichnen der Graphen links
  
;to do
  
EndProcedure

Procedure draw_dbk(*ArrayPointer,farbe.l)  ;Zeichnen der Graphen rechts
  
;to do
  
EndProcedure

Procedure draw_graph_as_line()  ;Zeichnen der aktuellen Parameter, Prfgrssen

:to do

EndProcedure 

Procedure set_to_init()  ;Setzen auf Starkonzentration / Anfangswerte 
  
  tempmax.d
  
  anfangszustand=1
  time=0
  dbktime=0
  frakt_time=0
  fraktsum=0
  frakt_vol=0
  n_frakt=0
  theta=theta_ges*(1-theta_im_anteil)
  theta_im=theta_ges*theta_im_anteil

  ReDim fraktionen.xy(n_frakt)
  ReDim drawdbk_frakt.xy(n_frakt)
  go=0
  Q=Q_start
  v=Q/(grundflaeche*theta)
  frakt_deltat=frakt_deltat_start
  vol_vg=vol_vg_start
  conc_vg_imp=conc_vg_init
  conc_dfz_in=conc_dfz_in_start
  conc_dfz_ef=conc_dfz_ef_start
  SetGadgetText(#String_Q,StrD(Q,4))
  SetGadgetText(#String_Fraktionsdauer,StrD(frakt_deltat,4))
  SetGadgetText(#String_vol_vg,StrD(vol_vg,4))
  SetGadgetText(#String_conc_vg,StrD(conc_vg_imp,7))
  flussunterbrechung=0 
  ;v=v_init   
  long_Disp=v*dispersivity
  solve_matrix()
  dbkpoint_imp=0
  fraktpoint=0
  sum_control=0
  sum_control_S=0
  sum_control_Seq=0
  For i=0 To nodes
    If useimportedconc
      conc_implicit(i)=initconc(i)
      S_implicit(i)=initS(i)
      Seq(i)=initSeq(i)
      conc_immobile(i)=initconc(i)
      S_immobile(i)=initS(i)
      Seq_immobile(i)=initSeq(i)
    Else
      conc_implicit(i)=background
      Seq(i)=isothermeq(conc_implicit(i))
      S_implicit(i)=isotherme(conc_implicit(i))
      conc_immobile(i)=background
      Seq_immobile(i)=isothermeq(conc_implicit(i))
      S_immobile(i)=isotherme(conc_implicit(i))
    EndIf
    bakterien(i)=bakterienzahl_init
    sum_control+conc_implicit(i)*deltax*grundflaeche*theta+conc_immobile(i)*deltax*grundflaeche*theta_im
    sum_control_S+S_implicit(i)*deltax*grundflaeche*(1-verteilung)*lagerungsdichte*(1-theta_im_anteil)+S_immobile(i)*deltax*grundflaeche*(1-verteilung)*lagerungsdichte*theta_im_anteil
    sum_control_Seq+Seq(i)*deltax*grundflaeche*verteilung*lagerungsdichte*(1-theta_im_anteil)+Seq_immobile(i)*deltax*grundflaeche*verteilung*lagerungsdichte*theta_im_anteil
  Next i
  For i=0 To n_dbk
    dbk_implicit(i)=0
    dbk_implicit_vg(i)=0
    dbk_dfz_in(i)=0
    dbk_dfz_ef(i)=0
    Strom(i)=0
    spannung(i)=0
  Next i
  dbk_implicit(0)=0
  If converttolf:dbk_implicit_vg(0)=leitf(conc_vg_init):Else:dbk_implicit_vg(0)=conc_vg_init:EndIf
  dbk_dfz_in(0)=conc_dfz_in_start
  dbk_dfz_ef(0)=conc_dfz_ef_start 
  
  R_gesamt=0
  R_bereich=0
  meanlf=0
  For i=0 To nodes
    R_gesamt+deltax/(archie(leitf(conc_implicit(i)))*grundflaeche)
    If i*deltax>spannungsabnahme1 And i*deltax<=spannungsabnahme2
      R_bereich+deltax/(archie(leitf(conc_implicit(i)))*grundflaeche)
    EndIf
    meanlf+leitf(conc_implicit(i))
  Next i
  meanlf/nodes
  stromfluss=spannung_gesamt/R_gesamt
  spannung_bereich=stromfluss*R_bereich
  strom(0)=stromfluss
  spannung(0)=spannung_bereich
  
  For i=0 To n_frakt
    fraktionen(i)\x=0
    fraktionen(i)\y=0
  Next i
  
  sum_check_imp=sum_control
  S_check_imp=sum_control_S
  Seq_check_imp=sum_control_Seq
  dbk_check=0
  vg_check=0
  dfz_in_check=0
  dfz_ef_check=0
  
  tempmax=initconc(1)
  
  For i=0 To nodes
    If initconc(i)>tempmax
      tempmax=initconc(i)
      peak_imp=i*deltax+minx
    EndIf
  Next i
  
EndProcedure

Procedure set_scale()  ;Skalierung fr die Ausgabe der Konzentrationsverteilung  
  max.d
  
  max=0
  If drawfrakt Or drawconc Or drawdbk Or drawvg Or drawdfz_in Or drawdfz_ef Or drawS Or drawSeq
    If conc_vg_init>conc_vg_imp:max=conc_vg_init:Else:max=conc_vg_imp:EndIf
    If conc_dfz_in_start>max:max=conc_dfz_in_start:EndIf
    If conc_dfz_ef_start>max:max=conc_dfz_ef_start:EndIf
  EndIf
  If drawstrom And stromfluss>max:max=stromfluss:EndIf
  If drawspannung And spannung_bereich>max:max=spannung_bereich:EndIf
  min=0
  For i=1 To nodes
    If initconc(i)>max And drawconc:max=initconc(i):EndIf
    If conc_implicit(i)>max And drawconc:max=conc_implicit(i):EndIf
    If initS(i)>max And drawS:max=initS(i):EndIf
    If initSeq(i)>max And drawSeq:max=initSeq(i):EndIf
    If S_implicit(i)>max And drawS:max=S_implicit(i):EndIf 
    If Seq(i)>max And drawSeq:max=Seq(i):EndIf
    If bakterien(i)>max And drawbac:max=bakterien(i):EndIf
  Next i
  For i=1 To n_dbk
    If dbk_implicit(i)>max And drawdbk:max=dbk_implicit(i):EndIf
    If dbk_implicit_vg(i)>max And drawvg:max=dbk_implicit_vg(i):EndIf
    If dbk_dfz_in(i)>max And drawdfz_in:max=dbk_dfz_in(i):EndIf
    If dbk_dfz_ef(i)>max And drawdfz_ef:max=dbk_dfz_ef(i):EndIf
    If spannung(i)>max And drawspannung:max=spannung(i):EndIf
    If strom(i)>max And drawstrom:max=strom(i):EndIf
    If dbk_fft(i)>max And drawfft:max=dbk_fft(i):EndIf
  Next i
  For i=1 To n_imp
    If import_xy(i)\y>max And drawimport:max=import_xy(i)\y:EndIf
  Next i
  For i=1 To n_frakt
    If fraktionen(i)\y>max And drawfrakt:max=fraktionen(i)\y:EndIf
  Next i
  If max=min:max+1:EndIf
  scalex=560/nodes
  scaley=400/(max-min)
  scalex_dbk=560/(bound_up-bound_low)
  middle=(max+min)/2
  
EndProcedure

Procedure import_conc()   ; Importiert Konzentrationsverteilung in der Sule auf Array initconc()
  
  temp.s
  startx.d
  endx.d
  n_import.l
  filefound.b
  
  filefound=0
  If Not init_sucess
    If ReadFile(0,directory+"init_conc.txt")
      filefound=1
    EndIf
  Else
    temp=OpenFileRequester("Select File",directory+"*.*","Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*",0)
    If temp
      directory=GetPathPart(temp)
      SetWindowTitle(0,"Parameter | "+directory)
    EndIf
    If ReadFile(0,temp)
      filefound=1
    ElseIf temp
      MessageRequester("Error","Could not open file") 
    EndIf   
  EndIf
  
  If filefound  
    n_import=0
    Repeat
      temp=ReadString(0)    
      CountString(temp, Chr(9)) 
      If ValD(StringField(temp,1,Chr(9)))
        n_import+1
        ReDim initconc.d(n_import)
        initconc(n_import)=ValD(StringField(temp,2,Chr(9)))
        If n_import=1
          startx=ValD(StringField(temp,1,Chr(9)))
        EndIf   
        If n_import=2
          deltax=ValD(StringField(temp,1,Chr(9)))-startx
        EndIf              
      EndIf
      If Eof(0) And n_import
        endx=ValD(StringField(temp,1,Chr(9)))
        minx=startx-deltax
        maxx=endx
        length=maxx-minx
        nodes=length/deltax
        SetGadgetText(#String_deltax,StrD(deltax,4))
        SetGadgetText(#String_maxx,StrD(maxx,4))
        SetGadgetText(#String_minx,StrD(minx,4))
        deltax_alt=ValD(GetGadgetText(#String_deltax))
      EndIf
    Until Eof(0)  
    CloseFile(0)
    If n_import
      ReDim initS.d(n_import)
      ReDim initSeq.d(n_import)
      ReDim bakterien.d(n_import)
      ReDim conc_implicit.d(n_import)
      ReDim conc_immobile.d(n_import)
      ReDim S_implicit.d(n_import)
      ReDim S_immobile.d(n_import)
      ReDim Seq_immobile.d(n_import)
      ReDim Seq.d(n_import)
      ReDim matrix.d(4,n_import)
      useimportedconc=1
    EndIf
    If init_sucess And n_import
      MessageRequester("Information","Data imported")    
    ElseIf init_sucess
      MessageRequester("Information","no Data imported")
    EndIf
    set_to_init()
    set_scale()
    convert_to_scale()
    draw_graph_as_line()
  EndIf
  
EndProcedure

Procedure Import_Seq()  ; Importiert sorbierte Konzentrationsverteilung in der Sule auf Array initS()
  
  temp.s
  startx.d
  endx.d
  n_import.l
  filefound.b
  
  filefound=0
  If Not init_sucess
    If ReadFile(0,directory+"init_Seq.txt")
      filefound=1
    EndIf
  Else
    temp=OpenFileRequester("Select File",directory+"*.*","Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*",0)
    If temp
      directory=GetPathPart(temp)
      SetWindowTitle(0,"Parameter | "+directory)
    EndIf
    If ReadFile(0,temp)
      filefound=1
    ElseIf temp
      MessageRequester("Error","Could not open file") 
    EndIf   
  EndIf
  
  If filefound  
    n_import=0
    Repeat
      temp=ReadString(0)    
      CountString(temp, Chr(9)) 
      If ValD(StringField(temp,1,Chr(9)))
        n_import=n_import+1
        ReDim initSeq.d(n_import)
        initSeq(n_import)=ValD(StringField(temp,2,Chr(9)))
        If n_import=1
          startx=ValD(StringField(temp,1,Chr(9)))
        EndIf
        If n_import=2
          deltax=ValD(StringField(temp,1,Chr(9)))-startx
        EndIf        
      EndIf
      If Eof(0) And n_import
        endx=ValD(StringField(temp,1,Chr(9)))
        minx=startx-deltax
        maxx=endx
        length=maxx-minx
        nodes=length/deltax
        SetGadgetText(#String_deltax,StrD(deltax,4))
        SetGadgetText(#String_maxx,StrD(maxx,4))
        SetGadgetText(#String_minx,StrD(minx,4))
        deltax_alt=ValD(GetGadgetText(#String_deltax))
      EndIf
    Until Eof(0)  
    CloseFile(0)
    If n_import
      ReDim matrix.d(3,n_import)
      ReDim initconc.d(n_import)
      ReDim bakterien.d(n_import)
      ReDim initS.d(n_import)
      ReDim conc_implicit.d(n_import)
      ReDim S_implicit.d(n_import)
      ReDim Seq.d(n_import)
      ReDim conc_immobile.d(n_import)
      ReDim Seq_immobile.d(n_import)
      ReDim S_immobile.d(n_import)
      useimportedconc=1
    EndIf
    If init_sucess And n_import
      MessageRequester("Information","Data imported")
    ElseIf init_sucess
      MessageRequester("Information","no Data imported")
    EndIf
    set_to_init()
    set_scale()
    convert_to_scale()
    draw_graph_as_line()
  EndIf
  
EndProcedure

Procedure Import_S()  ; Importiert sorbierte Konzentrationsverteilung in der Sule auf Array initS()
  
  temp.s
  startx.d
  endx.d
  n_import.l
  filefound.b
  
  filefound=0
  If Not init_sucess
    If ReadFile(0,directory+"init_Sneq.txt")
      filefound=1
    EndIf
  Else
    temp=OpenFileRequester("Select File",directory+"*.*","Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*",0)
    If temp
      directory=GetPathPart(temp)
      SetWindowTitle(0,"Parameter | "+directory)
    EndIf
    If ReadFile(0,temp)
      filefound=1
    ElseIf temp
      MessageRequester("Error","Could not open file") 
    EndIf   
  EndIf
  
  If filefound  
    n_import=0
    Repeat
      temp=ReadString(0)    
      CountString(temp, Chr(9)) 
      If ValD(StringField(temp,1,Chr(9)))
        n_import=n_import+1
        ReDim initS.d(n_import)
        initS(n_import)=ValD(StringField(temp,2,Chr(9)))
        If n_import=1
          startx=ValD(StringField(temp,1,Chr(9)))
        EndIf
        If n_import=2
          deltax=ValD(StringField(temp,1,Chr(9)))-startx
        EndIf        
      EndIf
      If Eof(0) And n_import
        endx=ValD(StringField(temp,1,Chr(9)))
        minx=startx-deltax
        maxx=endx
        length=maxx-minx
        nodes=length/deltax
        SetGadgetText(#String_deltax,StrD(deltax,4))
        SetGadgetText(#String_maxx,StrD(maxx,4))
        SetGadgetText(#String_minx,StrD(minx,4))
        deltax_alt=ValD(GetGadgetText(#String_deltax))
      EndIf
    Until Eof(0)  
    CloseFile(0)
    If n_import
      ReDim initconc.d(n_import)
      ReDim conc_implicit.d(n_import)
      ReDim bakterien.d(n_import)
      ReDim S_implicit.d(n_import)
      ReDim matrix.d(4,n_import)
      ReDim initSeq.d(n_import)
      ReDim Seq.d(n_import)
      ReDim conc_immobile.d(n_import)
      ReDim Seq_immobile.d(n_import)
      ReDim S_immobile.d(n_import)
      useimportedconc=1
    EndIf
    If init_sucess And n_import
      MessageRequester("Information","Data imported")
    ElseIf init_sucess
      MessageRequester("Information","no Data imported")
    EndIf
    set_to_init()
    set_scale()
    convert_to_scale()
    draw_graph_as_line()
  EndIf
  
EndProcedure

Procedure import_dbk()  ; Importiert Durchbruchskurve o.. die zur Inversion genutzt wird auf Array dbk_import()
  
  temp.s
  spalte.i
  
  temp=OpenFileRequester("Select File",directory+"*.*","Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*",0)
  If temp
    directory=GetPathPart(temp)
    samplename=GetFilePart(Mid(temp,1,Len(temp)-4))
    SetWindowTitle(0,"Parameter | "+directory)
    SetWindowTitle(1,"Plot | "+samplename)
  EndIf
  If ReadFile(0,temp)
    filefound=1
  ElseIf temp
    MessageRequester("Error","Could not open file") 
  EndIf   
  
  If filefound 
    n_import.i=-1
    temp=ReadString(0)
    If (Not ValD(StringField(temp,1,Chr(9)))) And (Not Mid(temp,1,1)="0")
      OpenWindow(3,200,400,100,100,"Select Column")
      ComboBoxGadget(#Combo_SelectColumn, 10, 10, 80, 20)
      For i=2 To CountString(temp,Chr(9))+1
        AddGadgetItem(#Combo_SelectColumn,-1,StringField(temp,i,Chr(9)))
      Next i
      SetGadgetState(#Combo_SelectColumn,import_column)
      ButtonGadget(#Button_EndSelection,10,60,80,20,"OK")
      Repeat
        event=WaitWindowEvent()
      Until EventGadget()=#Button_EndSelection
      spalte=GetGadgetState(#Combo_SelectColumn)+2
      import_column=GetGadgetState(#Combo_SelectColumn)
      CloseWindow(3)
    Else
      spalte=2      
    EndIf
    FileSeek(0,0)
    temp=ReadString(0)
    SetWindowTitle(1,"Plot | "+samplename+" | "+StringField(temp,spalte,(Chr(9))))
    While Not (StringField(temp,1,Chr(9))="1. Ableitung DBK" Or Eof(0))
      CountString(temp, Chr(9)) 
      If ValD(StringField(temp,1,Chr(9))) Or Mid(temp,1,1)="0"
        n_import+1      
        ReDim import_xy.xy(n_import)
        import_xy(n_import)\x=ValD(StringField(temp,1,Chr(9)))
        import_xy(n_import)\y=ValD(StringField(temp,spalte,Chr(9)))        
      EndIf
      temp=ReadString(0)
    Wend 
    CloseFile(0)
    If n_import>=0
      n_imp=n_import
      ReDim drawdbk_import.xy(n_imp)
      dataimported=1
      drawimport=1
      SetGadgetState(#CheckBox_drawimport,drawimport)
      MessageRequester("Information","Data imported")
    Else
      MessageRequester("Information","no Data imported")
    EndIf
    
    set_to_init()
    set_scale()
    convert_to_scale()
    draw_graph_as_line()
  EndIf
  
EndProcedure

Procedure import_isothermeq()  ; Importiert angepasste Isotherme auf Array linearisothermeq fr gleichgewicht()
  
  temp.s
  startx.d
  endx.d
  n_import.l
  filefound.b
  
  filefound=0
  If Not init_sucess
    If ReadFile(0,directory+"init_iso_eq.txt")
      filefound=1
    EndIf
  Else
    temp=OpenFileRequester("Select File",directory+"*.*","Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*",0)
    If temp
      directory=GetPathPart(temp)
      SetWindowTitle(0,"Parameter | "+directory)
    EndIf
    If ReadFile(0,temp)
      filefound=1
    ElseIf temp
      MessageRequester("Error","Could not open file") 
    EndIf   
  EndIf
  
  If filefound  
    n_import=0
    Repeat
      temp=ReadString(0)    
      CountString(temp, Chr(9)) 
      If ValD(StringField(temp,1,Chr(9)))
        n_import+1      
        ReDim linearisothermeq.xy(n_import)
        linearisothermeq(n_import)\x=ValD(StringField(temp,1,Chr(9)))
        linearisothermeq(n_import)\y=ValD(StringField(temp,2,Chr(9)))        
      EndIf
    Until Eof(0)  
    CloseFile(0)
    If n_import
      n_isoeq=n_import
      usefittedisothermeq=1
      SetGadgetState(#CheckBox_usefittedisothermeq,usefittedisothermeq)
    EndIf
    If init_sucess And n_import
      MessageRequester("Information","Data imported")
    ElseIf init_sucess
      MessageRequester("Information","no Data imported")
    EndIf
    set_to_init()
    set_scale()
    convert_to_scale()
    draw_graph_as_line()
  EndIf
  
EndProcedure

Procedure Import_isotherm()  ; Importiert angepasste Isotherme auf Array linearisotherm fr nichtgleichgewicht()
  
  temp.s
  startx.d
  endx.d
  n_import.l
  filefound.b
  
  filefound=0
  If Not init_sucess
    If ReadFile(0,directory+"init_iso_neq.txt")
      filefound=1
    EndIf
  Else
    temp=OpenFileRequester("Select File",directory+"*.*","Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*",0)
    If temp
      directory=GetPathPart(temp)
      SetWindowTitle(0,"Parameter | "+directory)
    EndIf
    If ReadFile(0,temp)
      filefound=1
    ElseIf temp
      MessageRequester("Error","Could not open file") 
    EndIf   
  EndIf
  
  If filefound  
    n_import=0
    Repeat
      temp=ReadString(0)    
      CountString(temp, Chr(9)) 
      If ValD(StringField(temp,1,Chr(9)))
        n_import=n_import+1      
        ReDim linearisotherm.xy(n_import)
        linearisotherm(n_import)\x=ValD(StringField(temp,1,Chr(9)))
        linearisotherm(n_import)\y=ValD(StringField(temp,2,Chr(9)))        
      EndIf
    Until Eof(0)  
    CloseFile(0)
    If n_import
      n_iso=n_import
      usefittedisotherm=1
      SetGadgetState(#CheckBox_usefittedisotherm,usefittedisotherm)
    EndIf
    If init_sucess And n_import
      MessageRequester("Information","Data imported")
    ElseIf init_sucess
      MessageRequester("Information","no Data imported")
    EndIf
    set_to_init()
    set_scale()
    convert_to_scale()
    draw_graph_as_line()
  EndIf
  
EndProcedure

Procedure Import_lfkorrelation()  ; Importiert angepasste Leitfhigkeitskorrelation auf lfkorrealtion()
  
  temp.s
  startx.d
  endx.d
  n_import.l
  filefound.b
  
  filefound=0
  If Not init_sucess
    If ReadFile(0,directory+"init_lfkorr.txt")
      filefound=1
    EndIf
  Else
    temp=OpenFileRequester("Select File",directory+"*.*","Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*",0)
    If temp
      directory=GetPathPart(temp)
      SetWindowTitle(0,"Parameter | "+directory)
    EndIf
    If ReadFile(0,temp)
      filefound=1
    ElseIf temp
      MessageRequester("Error","Could not open file") 
    EndIf   
  EndIf
  
  If filefound  
    n_import=0
    Repeat
      temp=ReadString(0)    
      CountString(temp, Chr(9)) 
      If ValD(StringField(temp,1,Chr(9)))
        n_import=n_import+1      
        ReDim lfkorrelation.xy(n_import)
        lfkorrelation(n_import)\x=ValD(StringField(temp,1,Chr(9)))
        lfkorrelation(n_import)\y=ValD(StringField(temp,2,Chr(9)))        
      EndIf
    Until Eof(0)  
    CloseFile(0)
    If n_import
      n_lfkorr=n_import
      usefittedlf=1
      SetGadgetState(#CheckBox_usefittedlf,usefittedlf)
    EndIf
    If init_sucess And n_import
      MessageRequester("Information","Data imported")
    ElseIf init_sucess
      MessageRequester("Information","no Data imported")
    EndIf
    set_to_init()
    set_scale()
    convert_to_scale()
    draw_graph_as_line()
  EndIf
  
EndProcedure

Procedure import_student_t()
  
  temp.s
  
  temp=maindirectory+"student_t.txt"
  If ReadFile(0,temp)
    filefound=1
  EndIf   
  
  If filefound  
    n_import=0
    Repeat
      temp=ReadString(0)    
      CountString(temp, Chr(9)) 
      If ValD(StringField(temp,1,Chr(9)))
        n_import=n_import+1      
        ReDim student_t_verteilung.xy(n_import)
        student_t_verteilung(n_import)\x=ValD(StringField(temp,1,Chr(9)))
        student_t_verteilung(n_import)\y=ValD(StringField(temp,2,Chr(9)))        
      EndIf
    Until Eof(0)  
    CloseFile(0)
    If n_import
      n_student_t=n_import
    EndIf 
  Else
    MessageRequester("Warning","Student-t not found")
  EndIf
  
EndProcedure  

Procedure Import_temp()
  
  temp.s
  startx.d
  endx.d
  n_import.l
  filefound.b
  
  filefound=0
  If Not init_sucess
    If ReadFile(0,directory+"init_temp.txt")
      filefound=1
    EndIf
  Else
    temp=OpenFileRequester("Select File",directory+"*.*","Text (*.txt)|*.txt|Alle Dateien (*.*)|*.*",0)
    If temp
      directory=GetPathPart(temp)
      SetWindowTitle(0,"Parameter | "+directory)
    EndIf
    If ReadFile(0,temp)
      filefound=1
    ElseIf temp
      MessageRequester("Error","Could not open file") 
    EndIf   
  EndIf
  
  If filefound  
    n_import=0
    Repeat
      temp=ReadString(0)    
      CountString(temp, Chr(9)) 
      If (ValD(StringField(temp,1,Chr(9))) Or ValD(StringField(temp,1,Chr(9)))=0) And StringField(temp,1,Chr(9))<>""
        n_import=n_import+1      
        ReDim tempgang.xy(n_import)
        tempgang(n_import)\x=ValD(StringField(temp,1,Chr(9)))
        tempgang(n_import)\y=ValD(StringField(temp,2,Chr(9)))        
      EndIf
    Until Eof(0)  
    CloseFile(0)
    If n_import
      n_temp=n_import
      usetemp=1
      SetGadgetState(#CheckBox_usetemp,usetemp)
    EndIf
    If init_sucess And n_import
      MessageRequester("Information","Data imported")
    ElseIf init_sucess
      MessageRequester("Information","no Data imported")
    EndIf
    set_to_init()
    set_scale()
    convert_to_scale()
    draw_graph_as_line()
  EndIf
  
EndProcedure  

Procedure.d student_t(n.l)
  
  For i=1 To n_student_t
    If student_t_verteilung(i)\x>=n
      ProcedureReturn student_t_verteilung(i)\y
    EndIf  
  Next i
  
EndProcedure  

Procedure.b one_cycle(*Quellpointer,*Zielpointer,n_inv.l)
  
  modelrun+1
  set_to_init()
  Repeat
    ereignis=WindowEvent()
    ExamineKeyboard()
    If (EventGadget()=#Button_reichtso And EventType()=#PB_EventType_LeftClick):genaugenug=1:EndIf
    If (EventGadget()=#Button_StartInv And EventType()=#PB_EventType_LeftClick) Or (KeyboardPushed(#PB_Key_Escape))   
      ProcedureReturn 0
    Else
      calculate_next_timestep_implicit()
    EndIf  
  Until Not dbktime<=dbkmaxtime 
  If GetGadgetState(#Combo_SelectInv)=4:n_inv=n_frakt:EndIf
  anstieg.d
  abstand.d
  counter.i=0
  
  For i=1 To n_inv
    If Not GetGadgetState(#Combo_SelectInv)=4
      Repeat
        If i*dbk_deltat>=import_xy(counter)\x And (i-1)*dbk_deltat<=import_xy(counter)\x
          anstieg=(PeekD(*Quellpointer+i*8)-PeekD(*Quellpointer+i*8-8))/(dbk_deltat)
          abstand=import_xy(counter)\x-((i-1)*dbk_deltat)
          PokeD(*Zielpointer+counter*8,anstieg*abstand+PeekD(*Quellpointer+i*8-8))
          If counter<n_imp
            counter+1
          EndIf  
        EndIf
      Until (Not (i*dbk_deltat>=import_xy(counter)\x And (i-1)*dbk_deltat<=import_xy(counter)\x)) Or counter=n_imp
    Else
      Repeat 
        If fraktionen(i)\x>=import_xy(counter)\x And fraktionen(i-1)\x<=import_xy(counter)\x
          anstieg=(fraktionen(i)\y-fraktionen(i-1)\y)/(fraktionen(i)\x-fraktionen(i-1)\x)
          abstand=import_xy(counter)\x-fraktionen(i-1)\x
          PokeD(*Zielpointer+counter*8,anstieg*abstand+fraktionen(i-1)\y)
          If counter<n_imp
            counter+1
          EndIf  
        EndIf
      Until (Not(fraktionen(i)\x>=import_xy(counter)\x And fraktionen(i-1)\x<=import_xy(counter)\x)) Or counter=n_imp
    EndIf
  Next i
  PokeD(*Zielpointer+n_imp*8,PeekD(*Quellpointer+n_inv*8))
  ProcedureReturn 1  
  
EndProcedure  

Procedure.b one_cycle_sens(*Quellpointer,*Zielpointer,n_inv.l)
  
  modelrun+1
  set_to_init()
  Repeat
    ereignis=WindowEvent()
    ExamineKeyboard()
    If (EventGadget()=#Button_sens_Start And EventType()=#PB_EventType_LeftClick) Or (KeyboardPushed(#PB_Key_Escape))   
      ProcedureReturn 0
    Else
      calculate_next_timestep_implicit()
    EndIf  
  Until Not dbktime<=dbkmaxtime 
  If GetGadgetState(#Combo_sens_selectbtc)=4:n_inv=n_frakt:EndIf
  anstieg.d
  abstand.d
  counter.i=0
  
  For i=0 To n_inv
    If Not GetGadgetState(#Combo_sens_selectbtc)=4
      PokeD(*Zielpointer+i*8,PeekD(*Quellpointer+i*8))
    Else
      PokeD(*Zielpointer+i*8,fraktionen(i)\y)
    EndIf
  Next i
  ProcedureReturn 1  
  
EndProcedure  

Procedure.d get_normal_rnd(mean.d,sigma.d)
  
  x1.d
  x2.d
  w.d
  x1=Random(10000000)/10000000
  x2=Random(10000000)/10000000
  w=Sqr(-2*Log(x1))*Cos(2*#PI*x2)
  ;Repeat
  ;  x1=2*Random(10000)/10000-1
  ;  x2=2*Random(10000)/10000-1
  ;  w=x1*x1+x2*x2
  ;Until w<1
  ;w=Sqr((-2*Log(w))/w)
  ;ProcedureReturn mean+sigma*x1*w
  ProcedureReturn mean+sigma*w
  
EndProcedure  

Procedure.d getnorm(*objective,n.l,objective_norm.d)
  temp.d=0
;   mean.d
;    For i=1 To n
;    mean+import_xy(i)\y
;  Next i
; mean/n
 For i=0 To n
   temp+Pow(Abs(PeekD(*objective+i*8)-import_xy(i)\y),objective_norm)
 Next i
 ProcedureReturn Sqr(temp/(n+1));/mean
EndProcedure  

Procedure select_btc(selecta.i,*n_inv)  ;returns pointer to array with curve; length of array saved to *n_inv; Selection based on Combolist
  n_inv.l
  Select selecta ;Auswahl gegen welche Kurve invertiert wird
    Case 0
      *Vergleichskurve=@dbk_implicit()
      drawdbk=1
      n_inv=n_dbk
      SetGadgetState(#CheckBox_drawDBK,drawdbk)
    Case 1
      *Vergleichskurve=@dbk_dfz_in()
      n_inv=n_dbk
      drawdfz_in=1
      SetGadgetState(#CheckBox_drawdfz_in,drawdfz_in)
    Case 2
      *Vergleichskurve=@dbk_dfz_ef()
      n_inv=n_dbk
      drawdfz_ef=1
      SetGadgetState(#CheckBox_drawdfz_ef,drawdfz_ef)  
    Case 3
      *Vergleichskurve=@dbk_implicit_vg()  
      drawvg=1
      n_inv=n_dbk
      SetGadgetState(#CheckBox_drawvg,drawvg)
    Case 4
      *Vergleichskurve=@fraktionen()
      drawfrakt=1
      n_inv=n_frakt
      SetGadgetState(#CheckBox_drawfrakt,drawfrakt)
    Case 5
      *Vergleichskurve=@strom()
      drawstrom=1
      n_inv=n_dbk
      SetGadgetState(#CheckBox_drawstrom,drawstrom)
    Case 6
      *Vergleichskurve=@spannung()
      drawspannung=1
      n_inv=n_dbk
      SetGadgetState(#CheckBox_drawspannung,drawspannung)
  EndSelect
  PokeL(*n_inv,n_inv)
  ProcedureReturn *Vergleichskurve
EndProcedure  

Procedure.s select_para(selecta.i,*n_string,*adresse) ; returns name of parameter as string; Gadget-Handle stored to *n_string; pointer to parameter stored to *adresse
  
  name.s
  n_string.i
  OpenPreferences(maindirectory+language)
  Select selecta
    Case 0
      *pointer=@Q_start
      n_string=#String_Q
      name=ReadPreferenceString("lang_Q","Q")
    Case 1
      *pointer=@Diff
      n_string=#String_Diff
      name=ReadPreferenceString("lang_diff_coeff","diffusion")
    Case 2
      *pointer=@dispersivity
      n_string=#String_dispersivity
      name=ReadPreferenceString("lang_dispersivity","dispersivity")
    Case 3
      *pointer=@kr
      n_string=#String_kr
      name=ReadPreferenceString("lang_mass_transfer","mass transfer")
      usesorption=1
      SetGadgetState(#CheckBox_usesorption,usesorption)
    Case 4
      *pointer=@Kd_eq
      n_string=#String_Kd_eq
      name="Kd eq"
      usesorption=1
      SetGadgetState(#CheckBox_usesorption,usesorption)
    Case 5
      *pointer=@Kd
      n_string=#String_Kd
      name="Kd neq"
      usesorption=1
      SetGadgetState(#CheckBox_usesorption,usesorption)
    Case 6
      *pointer=@freund_n_eq
      n_string=#String_freund_n_eq
      If isotherme=1:name="freundl. exp. eq":Else:name="S max eq":EndIf
      usesorption=1
      SetGadgetState(#CheckBox_usesorption,usesorption)
    Case 7  
      *pointer=@freund_n
      n_string=#String_freund_n
      If isotherme=1:name="freundl. exp. neq":Else:name="S max neq":EndIf
      usesorption=1
      SetGadgetState(#CheckBox_usesorption,usesorption)
    Case 8
      *pointer=@theta_ges
      n_string=#String_theta
      name=ReadPreferenceString("lang_theta","theta")
    Case 9
      *pointer=@lagerungsdichte
      n_string=#String_Lagerungsdichte
      name=ReadPreferenceString("lang_bulk_density","bulk density")
    Case 10
      *pointer=@verteilung
      n_string=#String_verteilung
      name=ReadPreferenceString("lang_anteil_eq","fraction of equilibrium sites")
    Case 11
      *pointer=@theta_im_anteil
      n_string=#String_theta_immobile
      name=ReadPreferenceString("lang_theta_immobile","Anteil im. Porenwasser") 
    Case 12
      *pointer=@mass_trans_im
      n_string=#String_massentransfer_immobile
      name=ReadPreferenceString("lang_mass_transfer_immobile","Massentransfer im. Porenwasser") 
    Case 13
      *pointer=@abbau_1
      n_string=#String_Abbau_1
      name=ReadPreferenceString("lang_decay","decay 1st order")
    Case 14
      *pointer=@produktion
      n_string=#String_Produktion
      name=ReadPreferenceString("lang_production","production")
    Case 15
      *pointer=@verdunstung
      n_string=#String_Verdunstung
      name=ReadPreferenceString("lang_evaporation","evaporation")
    Case 16
      usevoltage=1
      SetGadgetState(#CheckBox_usevoltage,usevoltage)
      *pointer=@porositaet
      n_string=#String_Porositaet
      name=ReadPreferenceString("lang_porosity","porosity")
    Case 17
      usevoltage=1
      SetGadgetState(#CheckBox_usevoltage,usevoltage)
      *pointer=@zementierungsfaktor
      n_string=#String_Zementierungsfaktor
      name=ReadPreferenceString("lang_cementation","cementation factor")
    Case 18
      usevoltage=1
      SetGadgetState(#CheckBox_usevoltage,usevoltage)
      *pointer=@saettigung
      n_string=#String_Saettigung
      name=ReadPreferenceString("lang_saturation","saturation")
    Case 19
      usevoltage=1
      SetGadgetState(#CheckBox_usevoltage,usevoltage)
      *pointer=@saettigungsexponent
      n_string=#String_Saettigungsexponent
      name=ReadPreferenceString("lang_sat_exp","saturation exponent")
    Case 20
      usevoltage=1
      SetGadgetState(#CheckBox_usevoltage,usevoltage)
      *pointer=@temperaturkoeffizient
      n_string=#String_temperaturkoeffizient
      name=ReadPreferenceString("lang_tempcoeff","temperature coefficient")
    Case 21
      *pointer=@vol_dfz_in
      n_string=#String_vol_DFZ_in
      name=ReadPreferenceString("lang_vol_dfz_in","dead volume influent") 
    Case 22
      *pointer=@vol_dfz_ef
      n_string=#String_vol_DFZ_ef
      name=ReadPreferenceString("lang_vol_dfz_ef","dead volume effluent")
    Case 23
      *pointer=@weiterQ1
      n_string=#String_weiterQ1
      name="cont. Q 1"
    Case 24
      *pointer=@weiterQ2
      n_string=#String_weiterQ2
      name="cont. Q 2"
    Case 25
      *pointer=@weiterQ3
      n_string=#String_weiterQ3
      name="cont. Q 3"
    Case 26
      *pointer=@weiterQ4
      n_string=#String_weiterQ4
      name="cont. Q 4"
    Case 27
      *pointer=@background
      n_string=#String_background
      name=ReadPreferenceString("lang_background","concentration at start")
    Case 28
      *pointer=@conc_vg_init
      n_string=#String_conc_vg
      name=ReadPreferenceString("lang_conc_vg","concentration in supply vessel")
    Case 29
      *pointer=@vol_vg_start
      n_string=#String_vol_vg
      name=ReadPreferenceString("lang_vol_vg","volume of supply vessel")
  EndSelect
  ClosePreferences()
  PokeI(*adresse,*pointer)
  PokeI(*n_string,n_string)
  ProcedureReturn name
  
EndProcedure  

Procedure batch_btcs() ;loop over parameter over sens steps and retrieve a BTC each time, then save as matrix to ASCII file
  
  n_inv.l=n_dbk
  name.s
  n_string.i
  SetGadgetText(#Button_sens_Start, "Abbruch")
    
  Dim ableitungen.d(sens_steps,n_inv)
  Dim retardations.d(sens_steps)
  Dim avg_arrival.d(sens_steps)
  set_to_init()
  draw_nothing()
  *Vergleichskurve=select_btc(GetGadgetState(#Combo_sens_selectbtc),@n_inv)
  name=select_para(GetGadgetState(#Combo_sens_parameter),@n_string,@*pointer)

  Dim scaler.d(sens_steps)
  If sens_log
    stepsize.d=Pow(batch_end/batch_start,1/sens_steps)  
  Else  
    stepsize.d=(batch_end-batch_start)/sens_steps
  EndIf 

  For i=0 To sens_steps
    
      set_scale()
      get_check_values()
      convert_to_scale()
      draw_graph_as_line()
      If sens_log
        PokeD(*pointer,batch_start*Pow(stepsize,i))
        scaler(i)=PeekD(*pointer)
      Else  
        PokeD(*pointer,i*stepsize+batch_start)
        scaler(i)=PeekD(*pointer)
      EndIf

      If Not one_cycle_sens(*Vergleichskurve,@ableitungen(i,0),n_inv):broken=1:Break(1):EndIf
      If kreislauf
        retardations(i)=show_extrema(1)
      Else  
        retardations(i)=show_extrema(1)
        avg_arrival(i)=calculate_moments(1)
      EndIf
    Next i
    tempf.s
    tempf=SaveFileRequester("Select Sensitivity Export File",directory+"sensitivity_"+name+"_"+StrD(batch_start)+"_"+StrD(batch_end)+".txt","Text (*.txt)|*.txt|Bild (*.png)|*.png|Alle Dateien (*.*)|*.*",0)
    If tempf
      directory=GetPathPart(tempf)
      SetWindowTitle(0,"Parameter | "+directory)
    EndIf
    
    If SelectedFilePattern()=0 And Not GetExtensionPart(tempf)="txt"
      tempf+".txt"    
    EndIf  
    
    If check_overwrite(tempf)
      WriteString(0,name+Chr(9))
      For i=0 To n_inv
        If i<n_inv
          WriteString(0,StrD(dbk_pv(i))+Chr(9))
        Else  
          WriteStringN(0,StrD(dbk_pv(i)))
      EndIf
      Next i  
      For i=0 To sens_steps
        WriteString(0,StrD(scaler(i))+Chr(9))
        For j=0 To n_inv
          If j<n_inv
            WriteString(0,StrD(ableitungen(i,j))+Chr(9))
          Else
            WriteStringN(0,StrD(ableitungen(i,j)))
           EndIf 
         Next j 
        Next i
      CloseFile(0)
    EndIf
    
    If check_overwrite(Mid(tempf,1,Len(tempf)-4)+"_retard.txt")
      If kreislauf
        WriteStringN(0,name+Chr(9)+"R from first Peak") 
        For i=0 To sens_steps
          WriteStringN(0,StrD(scaler(i))+Chr(9)+StrD(retardations(i)))
        Next i
      Else
        WriteStringN(0,name+Chr(9)+"inflection"+Chr(9)+"avg arrival") 
        For i=0 To sens_steps
          WriteStringN(0,StrD(scaler(i))+Chr(9)+StrD(retardations(i))+Chr(9)+avg_arrival(i))
        Next i
      EndIf
      CloseFile(0)
    EndIf
    
SetGadgetText(#Button_sens_Start, "Start")
EndProcedure  

Procedure sensitivity() ;loop over two parameters and get norm -> surface of objective function; then save as matrix to ASCII file
  
  modelrun=0
  drawinversionparameters=1
  flussunterbrechung=0
  set_scale()
  
  SetGadgetText(#Button_StartInv, "Abbruch")
  temp.d
  name.s
  name2.s
  ;*pointer
  ;*Vergleichskurve
  n_inv.l
  n_string.i
  n_string2.i
  
  If use_for_forward_prediction
    n_imp=n_dbk
    ReDim import_xy.xy(n_imp)
    For i=0 To n_imp
      import_xy(i)\x=i*dbk_deltat
    Next i  
  Else  
    in_range.l=-1
    For i=0 To n_imp     ; get the actual amount of used imported points
      If import_xy(i)\x<=dbkmaxtime
        in_range+1
      EndIf  
    Next i
    Swap in_range,n_imp
  EndIf  
    
  set_to_init()  
  draw_nothing()
  
  *Vergleichskurve=select_btc(GetGadgetState(#Combo_SelectInv),@n_inv)
  
  name=select_para(GetGadgetState(#Combo_Parameter_Inv),@n_string,@*pointer)
  name2=select_para(GetGadgetState(#Combo_Parameter_Inv2),@n_string2,@*pointer2)    
   
  ;ReDim parameters.para(2)
  ;n_para=2
  ;parameters(1)\name=name
  ;parameters(2)\name=name2
  ;startwert1.d=PeekD(*pointer)
  startwert2.d=PeekD(*pointer2)
  
  Dim sens.d(steps1,steps2)
  Dim ableitungen.d(0,n_imp)
  Dim scaler1.d(steps1)
  Dim scaler2.d(steps2)
  
  If inv_log1
    stepsize1.d=Pow(iterationsende/iterationsstart,1/steps1)  
  Else  
    stepsize1.d=(iterationsende-iterationsstart)/steps1
  EndIf 
  If inv_log2
    stepsize2.d=Pow(iterationsende2/iterationsstart2,1/steps2)  
  Else  
    stepsize2.d=(iterationsende2-iterationsstart2)/steps2
  EndIf 
  
  For i=0 To steps1
    If inv_log1
      PokeD(*pointer,iterationsstart*Pow(stepsize1,i))
    Else
      PokeD(*pointer,iterationsstart+i*stepsize1)      
    EndIf
    scaler1(i)=PeekD(*pointer)
    If use_for_forward_prediction      
      If addnoise_to_forwardprediction:addnoise=1:Else:addnoise=0:EndIf  
      PokeD(*pointer2,startwert2)
      v=Q/(grundflaeche*theta)
      long_Disp=v*dispersivity
      If Not one_cycle(*Vergleichskurve,@ableitungen(0,0),n_inv):broken=1:Break(1):EndIf
      For j=0 To n_imp        
        import_xy(j)\y=ableitungen(0,j)
      Next j 
    EndIf
    addnoise=0

    For j=0 To steps2    
      If inv_log2
        PokeD(*pointer2,iterationsstart2*Pow(stepsize2,j))
      Else  
        PokeD(*pointer2,iterationsstart2+j*stepsize2)
      EndIf
      scaler2(j)=PeekD(*pointer2)
      v=Q/(grundflaeche*theta)
      long_Disp=v*dispersivity
      ;parameters(2)\start=PeekD(*pointer2)
      If Not one_cycle(*Vergleichskurve,@ableitungen(0,0),n_inv):broken=1:Break(2):EndIf
      ssr.d=getnorm(@ableitungen(0,0),n_imp,norm) 
      sens(i,j)=Sqr(ssr/n_imp)
     Next j
      set_scale()
      get_check_values()
      convert_to_scale()
      draw_graph_as_line()
  Next i  
  
  Swap in_range,n_imp
  
  
  If Not broken
    tempf.s
    tempf=SaveFileRequester("Select Sensitivity Export File",directory+"sensitivity.txt","Text (*.txt)|*.txt|Bild (*.png)|*.png|Alle Dateien (*.*)|*.*",0)
    If tempf
      directory=GetPathPart(tempf)
      SetWindowTitle(0,"Parameter | "+directory)
    EndIf
    
    If SelectedFilePattern()=0 And Not GetExtensionPart(tempf)="txt"
      tempf+".txt"    
    EndIf  
    
    If check_overwrite(tempf)
      tempf=""
      For j=0 To steps2
        tempf+Chr(9)+scaler2(j);StrD(iterationsstart2+j/steps2*(iterationsende2-iterationsstart2))
      Next j
      WriteStringN(0,tempf)
      For i=0 To steps1
        tempf=""
        tempf+scaler1(i);StrD(iterationsstart+i/steps1*(iterationsende-iterationsstart))
        For j=0 To steps2
          tempf+Chr(9)+sens(i,j)
        Next j
        WriteStringN(0,tempf)
      Next i
      CloseFile(0)
    EndIf
  EndIf
  SetGadgetText(#Button_StartInv, "Start")
    set_to_init()
  convert_to_scale()
  draw_graph_as_line()
  drawinversionparameters=0
EndProcedure  

Procedure inversion_multi()  ; Levenberg-Marquardt or simulated annealing
  
  modelrun=0
  n_inv.l
  n_para=-1
  name.s
  n_string.i
  ReDim rmsewerte.xy(0)
  ReDim draw_rmsewerte.xy(0)
  anzahl_rmsewerte=0
  ok.b=0
  statistics=""
  mean.d=0
  maximp.d=-Pow(10,30)
  minimp.d=Pow(10,30)
  in_range.l=-1
  For i=0 To n_imp     ; get the actual amount of used imported points
    If import_xy(i)\x<=dbkmaxtime
      in_range+1
    EndIf  
  Next i
  Swap in_range,n_imp
  For i=0 To n_imp          ; get mean of imported data
    If import_xy(i)\y>maximp:maximp=import_xy(i)\y:EndIf
    If import_xy(i)\y<minimp:minimp=import_xy(i)\y:EndIf
    mean+import_xy(i)\y
  Next i
  range.d=maximp-minimp
  mean/(n_imp+1)
  var.d=0
  For i=0 To n_imp   ;get variance of imported data
    var+Pow(import_xy(i)\y-mean,2)
  Next i
  
  set_to_init()  
  draw_nothing()
  
  *Vergleichskurve=select_btc(GetGadgetState(#Combo_SelectInv),@n_inv)
  
  drawimport=1
  SetGadgetState(#CheckBox_drawimport,drawimport)
  recorddbk=1
  SetGadgetState(#CheckBox_recordDBK,recorddbk)
  drawinversionparameters=1
  flussunterbrechung=0
  set_scale()
  SetGadgetText(#Button_StartInv, "Abbruch")
  HideGadget(#Button_reichtso,0)
  
  For i=0 To 29
    If #PB_ListIcon_Checked&GetGadgetItemState(#ListIcon_Parameters,i)=#PB_ListIcon_Checked
      n_para+1
      ReDim parameters.para(n_para)
      name=select_para(i,@n_string,@*pointer) 
      parameters(n_para)\start=PeekD(*pointer)
      parameters(n_para)\var=*pointer
      parameters(n_para)\n_string=n_string
      parameters(n_para)\name=name
    EndIf 
  Next i
  If inversionmode=2
    For i=0 To n_para
      If parameters(i)\start=0:parameters(i)\start=Pow(10,-6):EndIf
    Next i    
    delta.d=1.0001
    lambda=0.001
    iterationstiefe=0
    Repeat
      iterationstiefe+1
      temp.d
      Dim ableitungen.d(n_para+1,n_imp)
      Dim ergebnisvektor.d(n_para,0)
      Dim J.d(n_imp,n_para)
      Dim J_invers.d(n_para,n_imp)
      Dim Q_vektor.d(n_imp,0)
      Dim JTJ.d(n_para,n_para)
      Dim JTJ_invers.d(n_para,n_para)
      
      If Not one_cycle(*Vergleichskurve,@ableitungen(n_para+1,0),n_inv):broken=1:Break(1):EndIf
      
      ssr.d=getnorm(@ableitungen(n_para+1,0),n_imp,norm)

      set_scale()
      get_check_values()
      convert_to_scale()
      draw_graph_as_line()
      For i=0 To n_para
        If Not parameters(i)\start=0
          PokeD(parameters(i)\var,parameters(i)\start*delta)
        Else
          PokeD(parameters(i)\var,parameters(i)\start+(delta-1))          
        EndIf  
        If Not one_cycle(*Vergleichskurve,@ableitungen(i,0),n_inv):broken=1:Break(2):EndIf
        PokeD(parameters(i)\var,parameters(i)\start)
      Next i  
      
      For i=0 To n_imp
        For j=0 To n_para
          If Not parameters(j)\start=0
            J(i,j)=(ableitungen(j,i)-ableitungen(n_para+1,i))/(((delta-1)*parameters(j)\start))
          Else
            J(i,j)=(ableitungen(j,i)-ableitungen(n_para+1,i))/(delta-1)
          EndIf  
        Next j  
        Q_vektor(i,0)=import_xy(i)\y-ableitungen(n_para+1,i)
      Next i 
      matrix_multi(J(),J(),JTJ(),1,0)
      For i=0 To n_para
        JTJ(i,i)+lambda
      Next i
      matrix_inv(JTJ(),JTJ_invers())
      matrix_multi(JTJ_invers(),J(),J_invers(),0,1)
      matrix_multi(J_invers(),Q_vektor(),ergebnisvektor(),0,0)
      For i=0 To n_para
        parameters(i)\start+ergebnisvektor(i,0)
        PokeD(parameters(i)\var,parameters(i)\start)
      Next i  
      
      If Not one_cycle(*Vergleichskurve,@ableitungen(n_para+1,0),n_inv):broken=1:Break(1):EndIf
      
      temp=ssr
      ssr=getnorm(@ableitungen(n_para+1,0),n_imp,norm)
      If Not ssr<temp
      For i=0 To n_para
        parameters(i)\start-ergebnisvektor(i,0)
        PokeD(parameters(i)\var,parameters(i)\start)
      Next i     
        lambda*100
        ok=0
      Else
        lambda/10
        ok=1
      EndIf  
      ;MessageRequester("","lambda:"+StrD(lambda)+#eol+"ssr1:"+StrD(temp)+#eol+"ssr2:"+StrD(ssr))
      
      anzahl_rmsewerte+1
      ReDim rmsewerte.xy(anzahl_rmsewerte)
      ReDim draw_rmsewerte.xy(anzahl_rmsewerte) 
      rmsewerte(anzahl_rmsewerte)\x=anzahl_rmsewerte
      If Not IsNAN(ssr)
        rmsewerte(anzahl_rmsewerte)\y=ssr
      Else
        rmsewerte(anzahl_rmsewerte)\y=rmsewerte(anzahl_rmsewerte-1)\y
      EndIf  
    Until iterationstiefe=Val(GetGadgetText(#Spin_Inversionstiefe)) Or (temp/ssr<1.00000001 And ok) Or lambda>Pow(10,15) Or genaugenug
    
    genaugenug=0
    HideGadget(#Button_reichtso,1)
    rmsewerte(0)\x=0
    rmsewerte(0)\y=anzahl_rmsewerte
    
    If Not broken
      
      If Not one_cycle(*Vergleichskurve,@ableitungen(n_para+1,0),n_inv):broken=1:EndIf      
      temp=0
       For i=0 To n_imp
   temp+Pow(ableitungen(n_para+1,i)-import_xy(i)\y,2)
 Next i

      set_scale()
      get_check_values()
      convert_to_scale()
      draw_graph_as_line()
      For i=0 To n_para
        If Not parameters(i)\start=0
          PokeD(parameters(i)\var,parameters(i)\start*delta)
        Else
          PokeD(parameters(i)\var,parameters(i)\start+(delta-1))
        EndIf  
        If Not one_cycle(*Vergleichskurve,@ableitungen(i,0),n_inv):broken=1:Break(1):EndIf
        PokeD(parameters(i)\var,parameters(i)\start)
      Next i  
      
      For i=0 To n_imp
        For j=0 To n_para
          If Not parameters(j)\start=0
            J(i,j)=(ableitungen(j,i)-ableitungen(n_para+1,i))/(((delta-1)*parameters(j)\start))
          Else
            J(i,j)=(ableitungen(j,i)-ableitungen(n_para+1,i))/(delta-1)
          EndIf  
        Next j  
        Q_vektor(i,0)=import_xy(i)\y-ableitungen(n_para+1,i)
      Next i              
      matrix_multi(J(),J(),JTJ(),1,0)
      matrix_inv(JTJ(),JTJ_invers())
      
      statistics=""
      statistics+"Multi Parameter Fit vs. "+GetGadgetText(#Combo_SelectInv)+" ("+samplename+")"+#eol+"----"+#eol+StrD(norm)+"-norm:"+Chr(9)+StrD(getnorm(@ableitungen(n_para+1,0),n_imp,norm))+#eol+"SSQ: "+StrD(temp)+#eol+"RSquare:"+Chr(9)+StrD(1-temp/var)+#eol
      statistics+"Varianz:"+Chr(9)+StrD(temp/(n_imp))+#eol+"SD:"+Chr(9)+StrD(Pow(temp/(n_imp),0.5))+#eol+"RMSE:"+Chr(9)+StrD(Sqr(temp/(n_imp+1)))+#eol
      statistics+"NRMSE:"+Chr(9)+StrD((Sqr(temp/(n_imp+1)))/range)+#eol+"CV(RMSE):"+Chr(9)+StrD((Sqr(temp/(n_imp+1)))/mean)+#eol+#eol
      For i=0 To n_para
        parameters(i)\limit=student_t(n_imp+1)*Pow(temp/((n_imp-n_para))*JTJ_invers(i,i),0.5)
        statistics+parameters(i)\name+":"+Chr(9)+StrD(parameters(i)\start)+Chr(9)+"+-"+Chr(9)+StrD(parameters(i)\limit)+#eol
        ;statistics+"untere Grenze:"+Chr(9)+StrD(parameters(i)\start-parameters(i)\limit)+#eol+"obere Grenze:"+Chr(9)+StrD(parameters(i)\start+parameters(i)\limit)+#eol
        If parameters(i)\n_string=#String_dispersivity 
          statistics+"D (without Diffusion):"+Chr(9)+StrD(parameters(i)\start*v)+Chr(9)+"+-"+Chr(9)+StrD(parameters(i)\limit*v)+#eol;+#eol+"obere Grenze:"+Chr(9)+StrD((parameters(i)\start+parameters(i)\limit)*v)+#eol
        EndIf
        If parameters(i)\n_string=#String_Kd_eq
          statistics+"R:"+Chr(9)+StrD(1+verteilung*lagerungsdichte*parameters(i)\start/theta)+Chr(9)+"+-"+Chr(9)+StrD((1+verteilung*lagerungsdichte*parameters(i)\start/theta)-(1+verteilung*lagerungsdichte*(parameters(i)\start-parameters(i)\limit)/theta))+#eol;"untere Grenze:"+Chr(9)+StrD(1+verteilung*lagerungsdichte*(parameters(i)\start-parameters(i)\limit)/theta)+#eol+"obere Grenze:"+Chr(9)+StrD(1+verteilung*lagerungsdichte*(parameters(i)\start+parameters(i)\limit)/theta)+#eol
          If verteilung<1 And Kd>0 And kr>0
            statistics+"WARNING: Kd and R influenced by nonequilibrium sorption"+#eol
          EndIf  
        EndIf
        ;statistics+#eol
      Next i 
;       If Not Round(norm*1000,#PB_Round_Nearest)=2000
;         statistics+"CONFIDENCE INTERVALS ONLY VALID FOR 2-NORM"+#eol
;       EndIf  
      
      For i=0 To n_para
        SetGadgetText(parameters(i)\n_string,StrD(parameters(i)\start,6))
      Next i     
      statistics+#eol
      MessageRequester("found",statistics)
      export_statistics+statistics
      
    EndIf  
    
  ElseIf inversionmode=3
    
    n_histogram.i=0
    Dim histogram.d(n_para,n_histogram)
    Dim ableitungen.d(0,n_imp)
    Dim sigma.d(n_para)
    For i=0 To n_para
      sigma(i)=0.1*parameters(i)\start
    Next i  
    iterationstiefe=0
    one_cycle(*Vergleichskurve,@ableitungen(0,0),n_inv)
    best_ssr.d=Pow(10,30)
    Dim best_set.para(n_para)
    ssr=getnorm(@ableitungen(0,0),n_imp,norm)
    
    Repeat
      iterationstiefe+1
      n_distances.i=0
      Dim distances.d(n_para)
      For z=1 To equil_time
        For i=0 To n_para
          count=0
          Repeat
            count+1
            PokeD(parameters(i)\var,get_normal_rnd(parameters(i)\start,sigma(i)))
          Until PeekD(parameters(i)\var)>0 Or count=1000
        Next i
        If Not one_cycle(*Vergleichskurve,@ableitungen(0,0),n_inv):broken=1:Break(2):EndIf
        set_scale()
        get_check_values()
        convert_to_scale()
        draw_graph_as_line()
        temp=getnorm(@ableitungen(0,0),n_imp,norm)
        If (temp<ssr Or (Exp(-(temp-ssr)/(temperature_factor*ssr))>Random(10000)/10000)) And (Not IsNAN(temp)) And (Not IsInfinity(temp))
          n_distances+1
          ssr=temp
          If ssr<best_ssr:best_ssr=ssr:CopyArray(parameters(),best_set()):EndIf
          For i=0 To n_para
            distances(i)+Pow(parameters(i)\start-PeekD(parameters(i)\var),2)
            parameters(i)\start=PeekD(parameters(i)\var)
          Next i
          For j=0 To n_para
            histogram(j,n_histogram)=parameters(j)\start
          Next j
          n_histogram+1
       ReDim histogram.d(n_para,n_histogram)  
        EndIf
        anzahl_rmsewerte+1
        ReDim rmsewerte.xy(anzahl_rmsewerte)
        ReDim draw_rmsewerte.xy(anzahl_rmsewerte) 
        rmsewerte(anzahl_rmsewerte)\x=anzahl_rmsewerte
        If Not IsNAN(ssr)
          rmsewerte(anzahl_rmsewerte)\y=ssr
        Else
          rmsewerte(anzahl_rmsewerte)\y=rmsewerte(anzahl_rmsewerte-1)\y
        EndIf
      Next z
      For i=0 To n_para
        temp=Sqr(distances(i)/n_distances)   ;test der anpassung der wichtung der distances
        If temp:sigma(i)=temp:Else:sigma(i)*2:EndIf        
      Next i
      CopyArray(best_set(),parameters())
      temperature_factor*cooling_speed
    Until iterationstiefe=Val(GetGadgetText(#Spin_Inversionstiefe)) Or genaugenug
    
    temp_export.s
    CreateFile(0,directory+"export_histogramm.txt")
    For i=0 To n_histogram
      temp_export=""
      For j=1 To n_para
        If j<n_para
          temp_export+StrD(histogram(j,i))+Chr(9)
        Else
          temp_export+StrD(histogram(j,i))
        EndIf  
      Next j        
      WriteStringN(0,temp_export)
    Next i  
    CloseFile(0)
    
    genaugenug=0
    HideGadget(#Button_reichtso,1)
    rmsewerte(0)\x=0
    rmsewerte(0)\y=anzahl_rmsewerte
    
    If Not broken
      
      set_scale()
      get_check_values()
      convert_to_scale()
      draw_graph_as_line()   
      statistics=""
      For i=0 To n_para
        SetGadgetText(parameters(i)\n_string,StrD(parameters(i)\start,6))
        PokeD(parameters(i)\var,parameters(i)\start)
        statistics+parameters(i)\name+":"+Chr(9)+StrD(parameters(i)\start)+#eol
      Next i     
      statistics+#eol
      MessageRequester("found",statistics)
      export_statistics+statistics
      
    EndIf
    
  EndIf
  
  set_to_init()
  convert_to_scale()
  draw_graph_as_line()
  SetGadgetText(#Button_StartInv, "Start")
  drawinversionparameters=0 
  n_para=0
  ReDim parameters.para(n_para) 
  Swap in_range,n_imp
  
EndProcedure  

Procedure inversion()  ;Anpassung eines Parameters an importierte Kurve
  
  minpunkt.d
  minvalue.d
  temp.d
  name.s
  ;*pointer
  ;*Vergleichskurve
  anzahl_rmsewerte=0
  ReDim rmsewerte.xy(0)
  ReDim draw_rmsewerte.xy(0)
  n_inv.l
  n_string.i
  statistics=""
  mean.d=0
  
  For i=0 To n_imp
    mean+import_xy(i)\y
  Next i
  mean/(n_imp+1)
  var.d=0
  For i=0 To n_imp
    var+Pow(import_xy(i)\y-mean,2)
  Next i
  
  set_to_init()
  draw_nothing()
  
  *Vergleichskurve=select_btc(GetGadgetState(#Combo_SelectInv),@n_inv)
  
  drawimport=1
  SetGadgetState(#CheckBox_drawimport,drawimport)
  recorddbk=1
  SetGadgetState(#CheckBox_recordDBK,recorddbk)
  drawinversionparameters=1
  flussunterbrechung=0
  set_scale()
  
  SetGadgetText(#Button_StartInv, "Abbruch")
  
  OpenPreferences(maindirectory+language)
  name=select_para(GetGadgetState(#Combo_Parameter_Inv),@n_string,@*pointer)

  
  rmsewerte(0)\x=iterationsstart
  rmsewerte(0)\y=iterationsende
  For i=1 To tiefe  ;Suchroutine, pures Brute-Force
    iterationstiefe=i
    minvalue=Pow(10,25)    
    PokeD(*pointer,iterationsstart)
    v=Q/(theta*grundflaeche)
    long_Disp=v*dispersivity
    minpunkt=iterationsstart
    If GetGadgetState(#Combo_Parameter_Inv)=9
      length=maxx-minx
      nodes=length/deltax
      ReDim conc_implicit.d(nodes)
      ReDim bakterien.d(nodes)
      ReDim initconc.d(nodes)
      ReDim initS.d(nodes)
      ReDim Seq.d(nodes)
      ReDim initSeq.d(nodes)
      ReDim S_implicit.d(nodes)
      ReDim matrix.d(4,nodes)
      solve_matrix()
    EndIf
    
    For j=1 To raster+1

      Dim ableitungen.d(0,n_imp)
      iterationsschritt=j
      
      If Not one_cycle(*Vergleichskurve,@ableitungen(0,0),n_inv):broken=1:Break(1):EndIf      
      temp.d=getnorm(@ableitungen(0,0),n_imp,norm)
      
      anzahl_rmsewerte+1
      ReDim rmsewerte.xy(anzahl_rmsewerte)
      ReDim draw_rmsewerte.xy(anzahl_rmsewerte)
      
      rmsewerte(anzahl_rmsewerte)\x=PeekD(*pointer)
      rmsewerte(anzahl_rmsewerte)\y=temp
      
      If temp<minvalue
        minvalue=temp
        minpunkt=j
      EndIf
      
      set_scale()
      get_check_values()
      convert_to_scale()
      draw_graph_as_line()
      
      PokeD(*pointer,PeekD(*pointer)+(iterationsende-iterationsstart)/raster)
      v=Q/(grundflaeche*theta)
      long_Disp=v*dispersivity
      
      If j=raster+1 And i=tiefe
        bestfit.d=iterationsstart+(minpunkt-1)*(iterationsende-iterationsstart)/raster
        PokeD(*pointer,bestfit)
        v=Q/(grundflaeche*theta)
        long_Disp=v*dispersivity
        If Not one_cycle(*Vergleichskurve,@ableitungen(0,0),n_inv):broken=1:Break(1):EndIf  
        temp=getnorm(@ableitungen(0,0),n_imp,norm)
        statistics+"Fit for "+name+" vs. "+GetGadgetText(#Combo_SelectInv)+#eol+"----"+#eol+"Best Fit: "+StrD(bestfit)+#eol+StrD(norm)+"-norm: "+StrD(temp)+#eol+"RSquare: "+StrD(1-temp/var)+#eol
        statistics+"Varianz: "+StrD(temp/(n_imp-1))+#eol+"SD: "+StrD(Pow(temp/(n_imp-1),0.5))+#eol
        If GetGadgetState(#Combo_Parameter_Inv)=2
          statistics+"--------"+#eol
          statistics+"D: "+StrD(bestfit*v)+#eol
        EndIf
        If GetGadgetState(#Combo_Parameter_Inv)=4
          statistics+"--------"+#eol
          statistics+"R: "+StrD(1+verteilung*lagerungsdichte*bestfit/theta)+#eol
          If verteilung<1 And Kd>0 And kr>0
            statistics+"WARNING: Kd and R influenced by nonequilibrium sorption"+#eol
          EndIf  
        EndIf        
        statistics+#eol+#eol
        SetGadgetText(n_string,StrD(PeekD(*pointer),6))
        MessageRequester("found",statistics)
        export_statistics+statistics
      EndIf
      
      If GetGadgetState(#Combo_Parameter_Inv)=9
        length=maxx-minx
        nodes=length/deltax
        ReDim conc_implicit.d(nodes)
        ReDim bakterien.d(nodes)
        ReDim initconc.d(nodes)
        ReDim initS.d(nodes)
        ReDim initSeq.d(nodes)
        ReDim Seq.d(nodes)
        ReDim S_implicit.d(nodes)
        ReDim matrix.d(4,nodes)
      EndIf      
      
    Next j
    
    temp=(iterationsende-iterationsstart)/raster
    If minpunkt<raster
      iterationsende=iterationsstart+(minpunkt)*temp
    EndIf
    If minpunkt>1
      iterationsstart+(minpunkt-2)*temp
    EndIf      
    
  Next i
  
  SetGadgetText(#String_iterationsstart,StrD(iterationsstart,9))
  SetGadgetText(#String_iterationsende,StrD(iterationsende,9))  
  set_to_init()
  convert_to_scale()
  draw_graph_as_line()
  SetGadgetText(#Button_StartInv, "Start")
  drawinversionparameters=0

EndProcedure

Procedure.b fitting_criteria(Array source.d(1))
    
  SetGadgetText(#Button_FittingCriteria, "Abbruch")
  While dbktime<=dbkmaxtime 
    ereignis=WindowEvent()
    ExamineKeyboard()
    If (EventGadget()=#Button_FittingCriteria And EventType()=#PB_EventType_LeftClick) Or (KeyboardPushed(#PB_Key_Escape))   
      SetGadgetText(#Button_FittingCriteria, "Fitting Criteria")
      ProcedureReturn 0
    Else
      calculate_next_timestep_implicit()
    EndIf  
  Wend 
  
  anstieg.d
  abstand.d
  counter.i=0
  mean.d=0
  maximp.d=-Pow(10,30)
  minimp.d=Pow(10,30)
  in_range.l=-1
  For i=0 To n_imp     ; get the actual amount of used imported points
    If import_xy(i)\x<=dbkmaxtime
      in_range+1
    EndIf  
  Next i
  
  Dim ableitungen.d(in_range) 
  
  For i=1 To n_dbk
      Repeat
        If i*dbk_deltat>=import_xy(counter)\x And (i-1)*dbk_deltat<=import_xy(counter)\x
          anstieg=(source(i)-source(i-1))/(dbk_deltat)
          abstand=import_xy(counter)\x-((i-1)*dbk_deltat)
          ableitungen(counter)=anstieg*abstand+source(i-1)
          If counter<in_range
            counter+1
          EndIf  
        EndIf
      Until (Not (i*dbk_deltat>=import_xy(counter)\x And (i-1)*dbk_deltat<=import_xy(counter)\x)) Or counter=in_range
  Next i
  ableitungen(in_range)=source(n_dbk)
  
  For i=0 To in_range          ; get mean of imported data
    If import_xy(i)\y>maximp:maximp=import_xy(i)\y:EndIf
    If import_xy(i)\y<minimp:minimp=import_xy(i)\y:EndIf
    mean+import_xy(i)\y
  Next i
  range.d=maximp-minimp
  mean/(n_imp+1)
  var.d=0
  For i=1 To in_range   ;get variance of imported data
    var+Pow(import_xy(i)\y-mean,2)
  Next i
  ssr.d=0
  For i=0 To in_range
   ssr+Pow(ableitungen(i)-import_xy(i)\y,2)
  Next i
  statistics.s=""
  statistics+"Fitting Criteria vs. "+GetGadgetText(#Combo_FFT)+" ("+samplename+")"+#eol+"----"+#eol+StrD(norm)+"-norm:"+Chr(9)+StrD(getnorm(@ableitungen(),in_range,norm))+#eol+"SSQ: "+StrD(ssr)+#eol+"RSquare:"+Chr(9)+StrD(1-ssr/var)+#eol
  statistics+"Varianz:"+Chr(9)+StrD(ssr/(in_range))+#eol+"SD:"+Chr(9)+StrD(Pow(ssr/(in_range),0.5))+#eol+"RMSE:"+Chr(9)+StrD(Sqr(ssr/(in_range+1)))+#eol
  statistics+"NRMSE:"+Chr(9)+StrD((Sqr(ssr/(in_range+1)))/range)+#eol+"CV(RMSE):"+Chr(9)+StrD((Sqr(ssr/(in_range+1)))/mean)+#eol+#eol
  MessageRequester("Information",statistics)
  SetGadgetText(#Button_FittingCriteria, "Fitting Criteria")
  
EndProcedure 

Procedure shutdown()   ;Ordner speichern und schlieen
  
  If Not OpenPreferences("init.dat")
    CreatePreferences("init.dat")  
  EndIf
  WritePreferenceString("YATSI_defaultdirectory",directory) 
  WritePreferenceString("YATSI_language",language)
  WritePreferenceInteger("YATSI_xpos",WindowX(0))
  WritePreferenceInteger("YATSI_ypos",WindowY(0))
  WritePreferenceInteger("YATSI_last_inversion_parameter",last_inversion_parameter)
  WritePreferenceInteger("YATSI_last_inversion_parameter2",last_inversion_parameter2)
  WritePreferenceInteger("YATSI_inversionmode",inversionmode)
  WritePreferenceInteger("YATSI_last_inversion_parameter_sens",last_inversion_parameter_sens)
  WritePreferenceInteger("YATSI_last_inversion_curve",last_inversion_curve)
  WritePreferenceInteger("YATSI_last_inversion_curve_sens",last_inversion_curve_sens)
  WritePreferenceDouble("YATSI_objective_function_norm",norm)
  WritePreferenceInteger("YATSI_import_column",import_column)
  WritePreferenceInteger("YATSI_iteration_depth",tiefe)
  WritePreferenceInteger("YATSI_iteration_steps",raster)
  WritePreferenceInteger("YATSI_FFT_curve",selected_curve_for_FFT)
  WritePreferenceInteger("YATSI_Sensitivity_Steps1",steps1)
  WritePreferenceInteger("YATSI_Sensitivity_Steps2",steps2)
  WritePreferenceDouble("YATSI_Batch_start",batch_start)
  WritePreferenceDouble("YATSI_Batch_end",batch_end)
  WritePreferenceInteger("YATSI_sens_steps",sens_steps)
  WritePreferenceInteger("YATSI_sens_logscale",sens_log)
  WritePreferenceInteger("YATSI_inv_logscale1",inv_log1)
  WritePreferenceInteger("YATSI_inv_logscale2",inv_log2)
  WritePreferenceInteger("YATSI_useforwardprediction",use_for_forward_prediction)
  WritePreferenceDouble("YATSI_iterationsstart",iterationsstart)
  WritePreferenceDouble("YATSI_iterationsstart2",iterationsstart2)
  WritePreferenceDouble("YATSI_iterationsende",iterationsende)
  WritePreferenceDouble("YATSI_iterationsende2",iterationsende2)
  WritePreferenceInteger("YATSI_addnoise_to_forwardprediction",addnoise_to_forwardprediction)
  ;If IsScreenActive()
    WritePreferenceInteger("YATSI_screenheight",scrheight)
    WritePreferenceInteger("YATSI_width",scrwidth)
    ;EndIf
  ClosePreferences()
  End
  
EndProcedure

Procedure main() ; Haupt
  
  import_student_t()  
  init() 
     ;If LoadFont(0, "Arial", 8)
     ; SetGadgetFont(#PB_Default, FontID(0))   ; geladenen Arial 16 Zeichensatz als neuen Standard festlegen
    ;EndIf

  InitKeyboard()
  first=1
  read_parameters()
  Open_Window_0()
  
  ReDim initconc.d(nodes)   ;Initialkonzentrationen in der Sule
  ReDim initS.d(nodes)
  ReDim initSeq.d(nodes)
  ReDim bakterien.d(nodes)
  ReDim S_implicit.d(nodes)   ;aktuelle Konzentrationen in der Sule
  ReDim Seq.d(nodes)
  ReDim conc_implicit.d(nodes)
  ReDim conc_immobile.d(nodes) 
  ReDim Seq_immobile.d(nodes)
  ReDim S_immobile.d(nodes)
  ReDim dbk_implicit.d(n_dbk)   ;Durchbruchskurve am obspoint
  ReDim dbk_implicit_vg.d(n_dbk)  ;Vorratsgefverlauf
  ReDim dbk_pv.d(n_dbk)     ;Aufzeichung ausgetauschter Porenvolumen
  ReDim dbk_dfz_in.d(n_dbk) ;Konzentrationsverlauf in der DFZ
  ReDim dbk_dfz_ef.d(n_dbk)
  ReDim dbk_fft.d(n_dbk)
  ReDim strom.d(n_dbk)
  ReDim spannung.d(n_dbk)
  ReDim drawconc_implicit.d(560)  ;draw-Arrays die lediglich dem Zeichnen der Graphen dienen, sind immer auf 560 skaliert
  ReDim drawS_implicit.d(560)
  ReDim drawdbk_implicit.d(560)
  ReDim drawdbk_implicit_vg.d(560)
  ReDim drawS_immobile.d(560)
  ReDim drawSeq_immobile.d(560)
  ReDim drawconc_immobile.d(560)
  ReDim drawdbk_import.xy(n_imp)
  ReDim drawdbk_frakt.xy(n_frakt)
  ReDim drawdbk_dfz_in.d(560)
  ReDim drawdbk_dfz_ef.d(560)
  ReDim drawdbk_fft.d(560)
  ReDim drawSeq.d(560)
  ReDim lfkorrelation.xy(n_lfkorr)   ;aktuelle Leitfhigkeitskorrelation mit C und LF
  ReDim matrix.d(4,nodes)      ;matrix zum impliziten lsen der ADE 
  ReDim linearisotherm.xy(n_iso) ;lineare Isothermen
  ReDim linearisothermeq.xy(n_isoeq)
  ReDim import_xy.xy(n_imp)    ;importierte Kurve
  ReDim fraktionen.xy(n_frakt) ;Fraktionen
  
  import_conc()   ;automatischer Import
  import_S()
  import_Seq()
  import_isotherm()
  import_isothermeq()
  Import_lfkorrelation()
  Import_temp()
  
  set_to_init()
  OpenWindow(1,0,0,scrwidth,scrheight,"Plot",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget )
  OpenWindowedScreen(WindowID(1),0,0,scrwidth,scrheight,0,0,0)
  !fldcw[v_FPU_ControlWord]   ;dieser Quark hat Nerven gekostet, Windows ndert beim Aktivieren von DirectX die FPU!
    
  init_sucess=1
  unlocked=1
  dataimported=0
  
  ExamineKeyboard() 
  
  set_scale()  
  convert_to_scale()
  draw_graph_as_line()
  
  ;-Hauptschleife - Tastaturauswertung

  Repeat
    
    ExamineKeyboard() 
    If IsWindow(1)
      If Not (scrheight=WindowHeight(1) And scrwidth=WindowWidth(1)) And IsScreenActive()
        scrheight=WindowHeight(1)
        scrwidth=WindowWidth(1)
        CloseScreen()
        OpenWindowedScreen(WindowID(1),0,0,scrwidth,scrheight,0,0,0)
        !fldcw[v_FPU_ControlWord]
        ;set_scale()  
        ;convert_to_scale()
        ;draw_graph_as_line()
      EndIf
    EndIf
    
    event=WindowEvent()
    event_window=EventWindow()
    
;     If IsWindow(2)
;       If GetWindowState(2)=#PB_Window_Minimize
;         minimize=1
;       EndIf  
;     EndIf
;     
;     If IsWindow(3)
;       If GetWindowState(3)=#PB_Window_Minimize
;         minimize=1
;       EndIf  
;     EndIf
;     
;     If GetWindowState(1)=#PB_Window_Minimize Or minimize
;       ;SetWindowState(0,#PB_Window_Minimize)
;       Repeat
;         event=WaitWindowEvent()    
;       Until GetActiveWindow()=3 Or GetActiveWindow()=2 Or GetActiveWindow()=1 Or GetActiveWindow()=0
;       minimize=0
;     EndIf
    
    If event=#PB_Event_CloseWindow
      If event_window=2
        CloseWindow(2)
      EndIf  
      If event_window=3
        CloseWindow(3)
      EndIf 
      If event_window=1 
        CloseWindow(1)
      EndIf  
      If event_window=0     
        If MessageRequester("Warnung","Wirklich Beenden?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes       
          shutdown()
        EndIf  
      EndIf  
    EndIf
    
    If GetActiveWindow()=1 Or go    ;wenn Fokus auf Plotfenster
      If GetGadgetState(#Button_Mouse)=1
      ExamineMouse()    
      If WindowMouseX(1)>=0 And WindowMouseY(1)>=0 And unlocked
      ReleaseMouse(0)
      SetActiveWindow(1)
      unlocked=0
      ;MouseLocate(DesktopMouseX(), DesktopMouseY())      
      MouseLocate(WindowMouseX(1), WindowMouseY(1))
    EndIf  
  
    If (MouseX()=0 And MouseDeltaX()<0) Or (MouseX()=ScreenWidth()-1 And MouseDeltaX()>0) Or (MouseY()=0 And MouseDeltaY()<0) Or (MouseY()=ScreenHeight()-1 And MouseDeltaY()>0)
      SetActiveWindow(0)
      ReleaseMouse(1)
      unlocked=1
    EndIf
    
    If Not MouseButton(#PB_MouseButton_Left)
      selection_bar1=-1
      selection_bar2=-1
      If bound_low>bound_up
        Swap bound_low,bound_up
      EndIf
      If bound_low=bound_up
        bound_low=0
        bound_up=dbkmaxtime
      EndIf        
      If releasedbutton=0        
        set_scale()
        convert_to_scale()
        draw_graph_as_line()
      EndIf
      releasedbutton=1
      ersterklick=1  
    Else  
      releasedbutton=0
    EndIf  
    
    If MouseButton(#PB_MouseButton_Left) And Not releasedbutton
      If ersterklick
        selection_bar1=MouseX()
        bound_low_alt=bound_low
        bound_low=(MouseX()-680)/scalex_dbk+bound_low_alt:ersterklick=0
      Else
        selection_bar2=MouseX()        
        bound_up=(MouseX()-680)/scalex_dbk+bound_low_alt
        ;draw_graph_as_line()
      EndIf 
    EndIf  
    If MouseButton(#PB_MouseButton_Right)
      bound_low=0
      bound_up=dbkmaxtime
      zoomed=0
      ;set_scale()
      ;convert_to_scale()
      ;draw_graph_as_line()
    EndIf
    
    If MouseDeltaX() Or MouseDeltaY()
      ;draw_graph_as_line()
    EndIf
    EndIf
      
      
      If KeyboardReleased(#PB_Key_R)  ;zurcksetzen auf Startwerte
        set_to_init()
        ;set_scale()
        ;convert_to_scale()
        ;draw_graph_as_line()     
      EndIf
      
      If KeyboardReleased(#PB_Key_Return)   ;einzelner Zeitschritt
        
        calculate_next_timestep_implicit()
        get_check_values()
        ;convert_to_scale()
        ;draw_graph_as_line() 
        
      EndIf
      
      If KeyboardReleased(#PB_Key_G)  ;Starten/Beenden der Berechnung
        hold=0
        If go
          SetGadgetText(#Button_Start, "Start") 
          go=0
        ElseIf Not go
          SetGadgetText(#Button_Start, "Stop") 
          go=1
        EndIf  
      EndIf
      
      If (KeyboardPushed(#PB_Key_Space) Or go) And Not hold ;Rechenschleife wenn Space gedrckt
        
        calculate_next_timestep_implicit()      
        steps+1      
        If ElapsedMilliseconds()-secondwait>1000
          calc_speed=steps
          steps=0
          secondwait=ElapsedMilliseconds()
        EndIf      
        If ElapsedMilliseconds()-drawtime>30
          get_check_values()
          ;convert_to_scale()
          ;draw_graph_as_line() 
          drawtime=ElapsedMilliseconds()
        EndIf
        
        If haltezeit-deltat/2<time And haltezeit+deltat/2>time And GetGadgetState(#Radio_bezogen_auf_time)
          hold=1
          SetGadgetText(#Button_Start, "Start")
          go=0
          get_check_values()
          ;convert_to_scale()
          ;draw_graph_as_line()
        ElseIf haltezeit-deltat/2<dbktime And haltezeit+deltat/2>dbktime And GetGadgetState(#Radio_bezogen_auf_dbktime)
          go=0
          hold=1
          SetGadgetText(#Button_Start, "Start")
          get_check_values()
          ;convert_to_scale()
          ;draw_graph_as_line()
        EndIf      
        
      EndIf
      
      If KeyboardReleased(#PB_Key_Space)   ;rechnen solange Space gedrckt wird
        hold=0
        get_check_values()
        ;convert_to_scale()
        ;draw_graph_as_line()      
      EndIf
      
    EndIf 
    
    If Not GetActiveWindow()=1 And Not go;GetActiveWindow()=0 Or GetActiveWindow()=2 ;wenn Fokus auf Parameterfenster
      
      Repeat 
        ExamineKeyboard()
        event=WaitWindowEvent()
        event_window=EventWindow()
      Until (event=#PB_Event_Gadget) Or (event=#PB_Event_CloseWindow) Or KeyboardPushed(#PB_Key_Escape) Or (Not (GetActiveWindow()=0 Or GetActiveWindow()=2 Or GetActiveWindow()=3)); Or go
      
      transfer_boxes_to_variable()   ;nderungen im Parameterfenster sofort bertragen/umsetzen
      check_values()
      
      If event=#PB_Event_CloseWindow
        If event_window=2
          CloseWindow(2)
        EndIf
        If event_window=3
          CloseWindow(3)
        EndIf
      EndIf  
        
      If EventGadget()=#Button_Beenden Or KeyboardPushed(#PB_Key_Escape) Or (event=#PB_Event_CloseWindow And (event_window=1 Or event_window=0))
        ReleaseMouse(1):unlocked=1
        If Not GetActiveWindow()=2
          If MessageRequester("Warnung","Wirklich Beenden?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes
            shutdown()
          EndIf
        EndIf
      EndIf
      
      If EventGadget()=#Button_Start And  event=#PB_Event_Gadget     ;Start gedrckt -> Fokus wechselt
        If Not IsWindow(1)
          OpenWindow(1,0,0,scrwidth,scrheight,"Plot",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget )
          OpenWindowedScreen(WindowID(1),0,0,scrwidth,scrheight,0,0,0)
          !fldcw[v_FPU_ControlWord]
        Else  
        hold=0
        If Not go
          go=1
          SetGadgetText(#Button_Start, "Stop") 
        Else
          go=0
          SetGadgetText(#Button_Start, "Start")
        EndIf
        EndIf
      EndIf
      
      check_buttons()
      
      length=maxx-minx
      nodes=length/deltax
      n_dbk=dbkmaxtime/dbk_deltat
      
      If Not (nodes=nodesalt)     ;Redimensionierung der Array im Falle neuer Diskretisierung
        ReDim initconc.d(nodes)
        ReDim conc_implicit.d(nodes)
        ReDim bakterien.d(nodes)
        ReDim initS.d(nodes)
        ReDim initSeq.d(nodes)
        ReDim S_implicit.d(nodes)
        ReDim Seq.d(nodes)
        ReDim matrix.d(4,nodes)
        ReDim conc_immobile.d(nodes)   ;
        ReDim Seq_immobile.d(nodes)
        ReDim S_immobile.d(nodes)
        nodesalt=nodes
        ReDimdone=1
      EndIf
      If Not (n_dbk=n_dbk_alt)      
        ReDim dbk_implicit.d(n_dbk)
        ReDim dbk_implicit_vg.d(n_dbk)
        ReDim dbk_pv.d(n_dbk)
        ReDim dbk_dfz_in.d(n_dbk)
        ReDim dbk_dfz_ef.d(n_dbk)
        ReDim strom.d(n_dbk)
        ReDim spannung.d(n_dbk)
        ReDim dbk_fft.d(n_dbk)
        n_dbk_alt=n_dbk
        bound_low=0
        bound_up=dbkmaxtime
        ReDimdone=1
      EndIf
      
      If ReDimdone
        set_scale()
        ;convert_to_scale()
        ReDimdone=0
      EndIf
      
      If Not conc_vg_init=conc_vg_init_alt
        conc_vg_init_alt=conc_vg_init
        conc_vg_imp=conc_vg_init
      EndIf
      
      If Not frakt_deltat_start=frakt_deltat_alt
        frakt_deltat_alt=frakt_deltat_start
        frakt_deltat=frakt_deltat_start
      EndIf
      
      If Not Q_start=Q_alt
        Q_alt=Q_start
        Q=Q_start
        v=Q/(grundflaeche*theta)
      EndIf
      
      solve_matrix()
      ;set_scale()
      ExamineKeyboard()
      ;get_check_values()
      ;convert_to_scale()
      ;draw_graph_as_line()
      
      ;If go
      ;  SetActiveWindow(1)
      ;EndIf
      
    EndIf
    
    If KeyboardPushed(#PB_Key_Escape)
      ReleaseMouse(1):unlocked=1
      If MessageRequester("Warnung","Wirklich Beenden?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_Yes       
        shutdown()
      EndIf
    EndIf
    
  ForEver 
  
EndProcedure  

main()
